From 03b041737be1f258c435cec02a364ef353bb47a7 Mon Sep 17 00:00:00 2001 From: Thomas Moulard Date: Thu, 11 Apr 2013 17:30:04 +0900 Subject: [PATCH] Imported Upstream version 1.6.0 --- AUTHORS.txt | 4 + CMakeLists.txt | 275 + LICENSE.txt | 35 + PCLConfig.cmake.in | 571 + PCLConfigVersion.cmake.in | 13 + apps/CMakeLists.txt | 164 + .../pcl/apps/dominant_plane_segmentation.h | 286 + .../apps/impl/dominant_plane_segmentation.hpp | 856 + apps/include/pcl/apps/nn_classification.h | 303 + apps/include/pcl/apps/openni_passthrough.h | 130 + .../pcl/apps/organized_segmentation_demo.h | 149 + .../pcl/apps/render_views_tesselated_sphere.h | 151 + apps/include/pcl/apps/timer.h | 68 + apps/include/pcl/apps/vfh_nn_classifier.h | 269 + apps/src/convolve.cpp | 209 + apps/src/dominant_plane_segmentation.cpp | 45 + apps/src/feature_matching.cpp | 658 + ...multiscale_feature_persistence_example.cpp | 131 + apps/src/ni_linemod.cpp | 574 + apps/src/nn_classification_example.cpp | 87 + apps/src/openni_3d_concave_hull.cpp | 216 + apps/src/openni_3d_convex_hull.cpp | 214 + apps/src/openni_boundary_estimation.cpp | 231 + apps/src/openni_change_viewer.cpp | 166 + apps/src/openni_color_filter.cpp | 224 + apps/src/openni_fast_mesh.cpp | 215 + apps/src/openni_feature_persistence.cpp | 305 + .../openni_floodfill_planar_segmentation.cpp | 570 + apps/src/openni_grab_frame.cpp | 304 + apps/src/openni_ii_normal_estimation.cpp | 246 + apps/src/openni_mls_smoothing.cpp | 250 + apps/src/openni_mobile_server.cpp | 268 + ...nni_organized_multi_plane_segmentation.cpp | 202 + apps/src/openni_passthrough.cpp | 143 + apps/src/openni_passthrough.ui | 106 + apps/src/openni_planar_convex_hull.cpp | 207 + apps/src/openni_planar_segmentation.cpp | 201 + apps/src/openni_stream_compression.cpp | 510 + apps/src/openni_tracking.cpp | 714 + apps/src/openni_uniform_sampling.cpp | 195 + apps/src/openni_voxel_grid.cpp | 193 + apps/src/organized_segmentation_demo.cpp | 482 + apps/src/organized_segmentation_demo.ui | 226 + ...pcd_organized_multi_plane_segmentation.cpp | 217 + apps/src/ppf_object_recognition.cpp | 174 + apps/src/pyramid_surface_matching.cpp | 111 + apps/src/render_views_tesselated_sphere.cpp | 439 + ...ale_interest_region_extraction_example.cpp | 102 + apps/src/surfel_smoothing_test.cpp | 48 + apps/src/test_search.cpp | 139 + cmake/CMakeParseArguments.cmake | 138 + cmake/CudaComputeTargetFlags.cmake | 43 + cmake/Modules/FindEigen.cmake | 29 + cmake/Modules/FindFLANN.cmake | 63 + cmake/Modules/FindGLEW.cmake | 108 + cmake/Modules/FindMPI.cmake | 617 + cmake/Modules/FindOpenNI.cmake | 80 + cmake/Modules/FindQVTK.cmake | 23 + cmake/Modules/FindQhull.cmake | 79 + cmake/Modules/FindSphinx.cmake | 26 + cmake/Modules/Findlibusb-1.0.cmake | 70 + cmake/Modules/NSIS.template.in | 963 + cmake/cpack_options.cmake.in | 49 + cmake/dep_graph.cmake | 32 + cmake/images/README | 1 + cmake/images/pcl.ico | Bin 0 -> 5414 bytes cmake/images/pcl_horz_large_pos.bmp | Bin 0 -> 888738 bytes cmake/images/pcl_vert_large_pos.png | Bin 0 -> 13971 bytes cmake/images/pcl_vert_large_pos_no_text.bmp | Bin 0 -> 652454 bytes cmake/merge_cmake_install.py | 36 + cmake/pcl_all_in_one_installer.cmake | 82 + cmake/pcl_cpack.cmake | 140 + cmake/pcl_find_boost.cmake | 36 + cmake/pcl_find_python.cmake | 54 + cmake/pcl_find_ros.cmake | 68 + cmake/pcl_find_sse.cmake | 144 + cmake/pcl_options.cmake | 24 + cmake/pcl_pclconfig.cmake | 50 + cmake/pcl_targets.cmake | 686 + cmake/pcl_tests.cmake | 38 + cmake/pcl_utils.cmake | 427 + cmake/pkgconfig.cmake.in | 13 + cmake/uninstall_target.cmake.in | 66 + common/CMakeLists.txt | 170 + common/common.doxy | 14 + common/include/pcl/ModelCoefficients.h | 46 + common/include/pcl/PointIndices.h | 44 + common/include/pcl/PolygonMesh.h | 53 + common/include/pcl/TextureMesh.h | 116 + common/include/pcl/Vertices.h | 42 + common/include/pcl/channel_properties.h | 115 + common/include/pcl/cloud_properties.h | 90 + common/include/pcl/common/angles.h | 88 + .../include/pcl/common/bivariate_polynomial.h | 143 + common/include/pcl/common/centroid.h | 541 + common/include/pcl/common/common.h | 188 + common/include/pcl/common/common_headers.h | 46 + common/include/pcl/common/concatenate.h | 105 + common/include/pcl/common/distances.h | 191 + common/include/pcl/common/eigen.h | 858 + common/include/pcl/common/file_io.h | 88 + common/include/pcl/common/gaussian.h | 266 + common/include/pcl/common/geometry.h | 97 + common/include/pcl/common/impl/angles.hpp | 77 + .../pcl/common/impl/bivariate_polynomial.hpp | 303 + common/include/pcl/common/impl/centroid.hpp | 963 + common/include/pcl/common/impl/common.hpp | 383 + common/include/pcl/common/impl/eigen.hpp | 162 + common/include/pcl/common/impl/file_io.hpp | 81 + common/include/pcl/common/impl/gaussian.hpp | 113 + common/include/pcl/common/impl/intensity.hpp | 164 + common/include/pcl/common/impl/io.hpp | 397 + common/include/pcl/common/impl/norms.hpp | 233 + common/include/pcl/common/impl/pca.hpp | 257 + .../common/impl/piecewise_linear_function.hpp | 56 + .../common/impl/polynomial_calculations.hpp | 520 + common/include/pcl/common/impl/spring.hpp | 261 + .../transformation_from_correspondences.hpp | 93 + common/include/pcl/common/impl/transforms.hpp | 295 + .../pcl/common/impl/vector_average.hpp | 198 + common/include/pcl/common/intensity.h | 104 + common/include/pcl/common/intersections.h | 92 + common/include/pcl/common/io.h | 461 + common/include/pcl/common/norms.h | 198 + common/include/pcl/common/pca.h | 252 + .../pcl/common/piecewise_linear_function.h | 81 + common/include/pcl/common/point_operators.h | 548 + .../pcl/common/polynomial_calculations.h | 135 + .../include/pcl/common/poses_from_matches.h | 132 + common/include/pcl/common/spring.h | 132 + common/include/pcl/common/synchronizer.h | 178 + common/include/pcl/common/time.h | 174 + common/include/pcl/common/time_trigger.h | 109 + .../transformation_from_correspondences.h | 101 + common/include/pcl/common/transforms.h | 145 + common/include/pcl/common/utils.h | 62 + common/include/pcl/common/vector_average.h | 118 + common/include/pcl/console/parse.h | 356 + common/include/pcl/console/print.h | 233 + common/include/pcl/console/time.h | 91 + common/include/pcl/correspondence.h | 163 + common/include/pcl/exceptions.h | 244 + common/include/pcl/for_each_type.h | 107 + common/include/pcl/impl/instantiate.hpp | 96 + common/include/pcl/impl/point_types.hpp | 1325 + common/include/pcl/pcl_base.h | 360 + common/include/pcl/pcl_exports.h | 52 + common/include/pcl/pcl_macros.h | 396 + common/include/pcl/pcl_tests.h | 75 + common/include/pcl/point_cloud.h | 1044 + common/include/pcl/point_representation.h | 553 + common/include/pcl/point_traits.h | 298 + common/include/pcl/point_types.h | 602 + common/include/pcl/point_types_conversion.h | 203 + .../pcl/range_image/impl/range_image.hpp | 1212 + .../range_image/impl/range_image_planar.hpp | 108 + common/include/pcl/range_image/range_image.h | 841 + .../pcl/range_image/range_image_planar.h | 195 + common/include/pcl/ros/conversions.h | 343 + .../include/pcl/ros/register_point_struct.h | 165 + common/include/sensor_msgs/Image.h | 61 + common/include/sensor_msgs/PointCloud2.h | 101 + common/include/sensor_msgs/PointField.h | 54 + common/include/std_msgs/Header.h | 39 + common/src/common.cpp | 85 + common/src/correspondence.cpp | 81 + common/src/distances.cpp | 91 + common/src/gaussian.cpp | 219 + common/src/intersections.cpp | 114 + common/src/io.cpp | 395 + common/src/parse.cpp | 541 + common/src/pcl_base.cpp | 144 + common/src/poses_from_matches.cpp | 280 + common/src/print.cpp | 458 + common/src/range_image.cpp | 1046 + common/src/range_image_planar.cpp | 252 + common/src/time_trigger.cpp | 141 + common/test/CMakeLists.txt | 13 + common/test/test_common.cpp | 972 + common/test/test_eigen.cpp | 810 + common/test/test_gaussian.cpp | 71 + common/test/test_intensity.cpp | 83 + common/test/test_macros.cpp | 95 + common/test/test_operators.cpp | 99 + common/test/test_pca.cpp | 129 + common/test/test_plane_intersection.cpp | 312 + common/test/test_spring.cpp | 211 + common/test/test_vector_average.cpp | 81 + common/test/test_wrappers.cpp | 147 + doc/CMakeLists.txt | 2 + doc/advanced/Makefile | 6 + doc/advanced/content/_templates/layout.html | 8 + doc/advanced/content/branches_repository.rst | 48 + doc/advanced/content/c_cache.rst | 87 + .../content/compiler_optimizations.rst | 34 + doc/advanced/content/conf.py | 135 + doc/advanced/content/distcc.rst | 184 + doc/advanced/content/exceptions_guide.rst | 107 + .../content/how_to_write_a_tutorial.rst | 102 + doc/advanced/content/images/ccache.png | Bin 0 -> 26115 bytes doc/advanced/content/images/distcc.png | Bin 0 -> 23520 bytes doc/advanced/content/images/distcc_plot.png | Bin 0 -> 14758 bytes doc/advanced/content/images/optimize.png | Bin 0 -> 11016 bytes doc/advanced/content/images/unitybuild.jpg | Bin 0 -> 15710 bytes doc/advanced/content/index.rst | 132 + doc/advanced/content/minimal_example.rst | 63 + doc/advanced/content/pcl_style_guide.rst | 341 + doc/advanced/content/single_compile_unit.rst | 39 + doc/doxygen/CMakeLists.txt | 39 + doc/doxygen/doxyfile.in | 311 + doc/doxygen/doxygen_layout.xml | 184 + doc/doxygen/pcl.doxy | 58 + doc/overview/Makefile | 6 + doc/overview/content/_templates/layout.html | 8 + doc/overview/content/conf.py | 135 + .../content/images/visualization/bunny.jpg | Bin 0 -> 43598 bytes .../content/images/visualization/ex1.jpg | Bin 0 -> 13293 bytes .../content/images/visualization/ex2.jpg | Bin 0 -> 24567 bytes .../content/images/visualization/ex3.jpg | Bin 0 -> 46191 bytes .../content/images/visualization/ex4.jpg | Bin 0 -> 43822 bytes .../content/images/visualization/ex5.jpg | Bin 0 -> 17816 bytes .../images/visualization/histogram.jpg | Bin 0 -> 12928 bytes .../content/images/visualization/normals.jpg | Bin 0 -> 62874 bytes .../content/images/visualization/pcs.jpg | Bin 0 -> 67227 bytes .../images/visualization/range_image.jpg | Bin 0 -> 25106 bytes .../content/images/visualization/shapes.jpg | Bin 0 -> 31035 bytes doc/overview/content/index.rst | 35 + doc/overview/content/visualization.rst | 192 + doc/tutorials/CMakeLists.txt | 24 + doc/tutorials/Makefile | 6 + doc/tutorials/content/_templates/layout.html | 8 + doc/tutorials/content/adding_custom_ptype.rst | 850 + doc/tutorials/content/basic_structures.rst | 98 + doc/tutorials/content/benchmark.rst | 129 + doc/tutorials/content/benchmark_filters.rst | 48 + doc/tutorials/content/building_pcl.rst | 252 + doc/tutorials/content/cloud_viewer.rst | 63 + doc/tutorials/content/cluster_extraction.rst | 184 + .../compiling_pcl_dependencies_windows.rst | 325 + .../content/compiling_pcl_macosx.rst | 322 + .../content/compiling_pcl_windows.rst | 356 + doc/tutorials/content/compression.rst | 268 + doc/tutorials/content/concatenate_clouds.rst | 134 + doc/tutorials/content/concatenate_fields.rst | 98 + doc/tutorials/content/concatenate_points.rst | 92 + doc/tutorials/content/conditional_removal.rst | 64 + doc/tutorials/content/conf.py | 138 + doc/tutorials/content/convex_hull_2d.rst | 61 + doc/tutorials/content/cvfh_signature.rst | 142 + .../content/cylinder_segmentation.rst | 106 + doc/tutorials/content/extract_indices.rst | 96 + .../content/feature_evaluation_framework.rst | 235 + doc/tutorials/content/fpfh_estimation.rst | 165 + doc/tutorials/content/greedy_projection.rst | 152 + doc/tutorials/content/how_features_work.rst | 240 + doc/tutorials/content/hull_2d.rst | 84 + doc/tutorials/content/images/2d_kdtree.png | Bin 0 -> 4457 bytes doc/tutorials/content/images/3dtree.png | Bin 0 -> 39105 bytes doc/tutorials/content/images/PCD_icon.png | Bin 0 -> 10872 bytes doc/tutorials/content/images/SVNCheckout.png | Bin 0 -> 44079 bytes doc/tutorials/content/images/bunny.jpg | Bin 0 -> 43598 bytes .../content/images/changedetectionThumb.png | Bin 0 -> 19744 bytes .../content/images/changedetectionViewer.png | Bin 0 -> 121412 bytes doc/tutorials/content/images/cloud_viewer.jpg | Bin 0 -> 40531 bytes .../content/images/cluster_extraction.jpg | Bin 0 -> 10389 bytes .../content/images/cmake_cminpack_1.png | Bin 0 -> 37899 bytes .../content/images/cmake_cminpack_2.png | Bin 0 -> 20001 bytes .../content/images/cmake_cminpack_3.png | Bin 0 -> 47324 bytes .../content/images/compression_tutorial.png | Bin 0 -> 18650 bytes .../content/images/concatenate_data.jpg | Bin 0 -> 10724 bytes .../content/images/concatenate_fields.jpg | Bin 0 -> 11537 bytes .../content/images/concave_hull_2d.gif | Bin 0 -> 1358 bytes .../content/images/convex_hull_2d.jpg | Bin 0 -> 5126 bytes .../content/images/cvfh_histogram.png | Bin 0 -> 3275 bytes .../content/images/cylinder_model_seg.png | Bin 0 -> 84877 bytes .../content/images/cylinder_segmentation.jpg | Bin 0 -> 3763 bytes doc/tutorials/content/images/ex1.jpg | Bin 0 -> 13293 bytes .../content/images/extract_indices.jpg | Bin 0 -> 6269 bytes .../feature_evaluation/class_hierarchy.png | Bin 0 -> 36726 bytes .../content/images/features_bunny.png | Bin 0 -> 117292 bytes .../images/features_input_explained.png | Bin 0 -> 68137 bytes .../content/images/features_normal.png | Bin 0 -> 59028 bytes .../content/images/features_small.png | Bin 0 -> 107670 bytes .../content/images/filters_small.png | Bin 0 -> 51498 bytes doc/tutorials/content/images/form_0.png | Bin 0 -> 357 bytes doc/tutorials/content/images/form_1.png | Bin 0 -> 395 bytes .../content/images/fpfh_estimation.jpg | Bin 0 -> 10963 bytes .../images/fpfh_estimation/fpfh_diagram.png | Bin 0 -> 48051 bytes .../images/fpfh_estimation/fpfh_theory.jpg | Bin 0 -> 24726 bytes .../content/images/good_features.png | Bin 0 -> 585693 bytes .../content/images/good_features_small.png | Bin 0 -> 35492 bytes .../content/images/greedy_triangulation.png | Bin 0 -> 25467 bytes doc/tutorials/content/images/histogram.jpg | Bin 0 -> 12928 bytes doc/tutorials/content/images/io_small.jpg | Bin 0 -> 8623 bytes .../images/iterative_closest_point.gif | Bin 0 -> 6381 bytes doc/tutorials/content/images/kdtree_mug.png | Bin 0 -> 245732 bytes .../content/images/kdtree_search.png | Bin 0 -> 9906 bytes doc/tutorials/content/images/kdtree_small.png | Bin 0 -> 29807 bytes .../content/images/keypoints_small.png | Bin 0 -> 111538 bytes doc/tutorials/content/images/macosx_logo.png | Bin 0 -> 27393 bytes .../content/images/msvc_build_build_all.jpg | Bin 0 -> 12425 bytes .../content/images/msvc_build_install.jpg | Bin 0 -> 18531 bytes .../content/images/narf_descriptor.jpg | Bin 0 -> 18636 bytes .../images/narf_descriptor_visualization.png | Bin 0 -> 80193 bytes .../images/narf_keypoint_extraction.png | Bin 0 -> 51024 bytes doc/tutorials/content/images/nn_kdtree.gif | Bin 0 -> 73807 bytes .../content/images/normal_estimation.png | Bin 0 -> 6680 bytes .../curvature_different_radii.png | Bin 0 -> 157274 bytes .../normal_estimation/flipped_scene1.png | Bin 0 -> 335720 bytes .../normal_estimation/flipped_scene2.png | Bin 0 -> 295249 bytes .../normal_estimation/flipped_sphere.png | Bin 0 -> 46337 bytes .../normals_different_radii.png | Bin 0 -> 60970 bytes .../normal_estimation/unflipped_scene1.png | Bin 0 -> 307152 bytes .../normal_estimation/unflipped_scene2.png | Bin 0 -> 326529 bytes .../normal_estimation/unflipped_sphere.png | Bin 0 -> 90253 bytes .../content/images/normal_estimation_ii.png | Bin 0 -> 3644 bytes doc/tutorials/content/images/normals.jpg | Bin 0 -> 62874 bytes doc/tutorials/content/images/octree_bunny.png | Bin 0 -> 181036 bytes .../content/images/octree_bunny2.png | Bin 0 -> 41985 bytes doc/tutorials/content/images/octree_img.png | Bin 0 -> 14942 bytes doc/tutorials/content/images/octree_small.png | Bin 0 -> 31989 bytes doc/tutorials/content/images/openni_cams.png | Bin 0 -> 440140 bytes .../content/images/openni_grabber.png | Bin 0 -> 7132 bytes doc/tutorials/content/images/pair_inc.png | Bin 0 -> 82180 bytes doc/tutorials/content/images/passthrough.png | Bin 0 -> 14826 bytes .../content/images/passthrough_2.png | Bin 0 -> 7044 bytes doc/tutorials/content/images/pcl_ccmake.png | Bin 0 -> 49333 bytes doc/tutorials/content/images/pcl_logo.png | Bin 0 -> 7824 bytes .../content/images/pcl_openni_viewer.jpg | Bin 0 -> 115727 bytes .../images/pcl_visualizer_color_custom.png | Bin 0 -> 26699 bytes .../images/pcl_visualizer_color_rgb.png | Bin 0 -> 56750 bytes ...l_visualizer_interaction_customization.png | Bin 0 -> 18615 bytes .../content/images/pcl_visualizer_normals.png | Bin 0 -> 67945 bytes .../content/images/pcl_visualizer_shapes.png | Bin 0 -> 70126 bytes .../content/images/pcl_visualizer_simple.png | Bin 0 -> 20334 bytes .../images/pcl_visualizer_viewports.png | Bin 0 -> 104138 bytes doc/tutorials/content/images/pcs.jpg | Bin 0 -> 67227 bytes .../content/images/pfh_estimation.png | Bin 0 -> 10530 bytes .../images/pfh_estimation/example_pfhs.png | Bin 0 -> 72072 bytes .../images/pfh_estimation/pfh_diagram.png | Bin 0 -> 20225 bytes .../images/pfh_estimation/pfh_frame.png | Bin 0 -> 12929 bytes .../content/images/planar_segmentation.jpg | Bin 0 -> 7873 bytes .../content/images/planar_segmentation_2.png | Bin 0 -> 4376 bytes .../content/images/plane_model_seg.png | Bin 0 -> 72925 bytes .../content/images/project_inliers.png | Bin 0 -> 28320 bytes .../content/images/project_inliers_2.png | Bin 0 -> 9267 bytes .../content/images/radius_outlier.png | Bin 0 -> 5377 bytes .../content/images/random_sample_example1.png | Bin 0 -> 6333 bytes .../content/images/random_sample_example2.png | Bin 0 -> 9068 bytes doc/tutorials/content/images/range_image.jpg | Bin 0 -> 25106 bytes .../images/range_image_border_points.png | Bin 0 -> 26010 bytes .../content/images/range_image_small.png | Bin 0 -> 79861 bytes .../images/range_image_visualization.png | Bin 0 -> 57208 bytes .../content/images/ransac_inliers_plane.png | Bin 0 -> 10564 bytes .../content/images/ransac_inliers_sphere.png | Bin 0 -> 12233 bytes .../content/images/ransac_outliers_plane.png | Bin 0 -> 12816 bytes .../content/images/ransac_outliers_sphere.png | Bin 0 -> 12434 bytes doc/tutorials/content/images/read_pcd.jpg | Bin 0 -> 8580 bytes .../block_diagram_single_iteration.png | Bin 0 -> 114604 bytes .../images/registration/registration_api.png | Bin 0 -> 30074 bytes .../content/images/registration/s1-6.png | Bin 0 -> 408415 bytes .../content/images/registration/scans.png | Bin 0 -> 407496 bytes .../content/images/registration_small.png | Bin 0 -> 64147 bytes doc/tutorials/content/images/resampling.jpg | Bin 0 -> 3443 bytes doc/tutorials/content/images/resampling_1.png | Bin 0 -> 278084 bytes doc/tutorials/content/images/resampling_2.png | Bin 0 -> 61578 bytes doc/tutorials/content/images/s1-6.png | Bin 0 -> 408415 bytes .../sample_consensus_planes_cylinders.png | Bin 0 -> 628285 bytes .../content/images/sample_consensus_small.png | Bin 0 -> 65786 bytes doc/tutorials/content/images/scans.png | Bin 0 -> 407496 bytes .../content/images/segmentation_small.png | Bin 0 -> 41246 bytes doc/tutorials/content/images/shapes.jpg | Bin 0 -> 31035 bytes .../content/images/statistical_removal.jpg | Bin 0 -> 6805 bytes .../content/images/statistical_removal_2.png | Bin 0 -> 269832 bytes doc/tutorials/content/images/surface_hull.png | Bin 0 -> 77872 bytes .../content/images/surface_meshing.png | Bin 0 -> 123357 bytes .../content/images/surface_small.png | Bin 0 -> 38337 bytes .../content/images/template_alignment_1.png | Bin 0 -> 318712 bytes .../content/images/template_alignment_2.png | Bin 0 -> 153512 bytes .../content/images/template_alignment_3.png | Bin 0 -> 183624 bytes .../content/images/template_alignment_4.png | Bin 0 -> 121348 bytes .../content/images/vfh_estimation.png | Bin 0 -> 23457 bytes .../images/vfh_estimation/first_component.png | Bin 0 -> 42436 bytes .../vfh_estimation/second_component.png | Bin 0 -> 39937 bytes .../images/vfh_estimation/vfh_example.png | Bin 0 -> 116385 bytes .../images/vfh_estimation/vfh_histogram.png | Bin 0 -> 21206 bytes .../vfh_histogram_visualized.png | Bin 0 -> 64664 bytes .../content/images/vfh_recognition.jpg | Bin 0 -> 5759 bytes .../images/vfh_recognition/objects.jpg | Bin 0 -> 21665 bytes .../images/vfh_recognition/pan_tilt.jpg | Bin 0 -> 37882 bytes .../images/vfh_recognition/scene_raw.png | Bin 0 -> 39765 bytes .../vfh_recognition/scene_segmented.png | Bin 0 -> 50765 bytes .../images/vfh_recognition/training.png | Bin 0 -> 109617 bytes .../images/vfh_recognition/vfh_example1.jpg | Bin 0 -> 8647 bytes .../images/vfh_recognition/vfh_example2.jpg | Bin 0 -> 8639 bytes .../images/vfh_recognition/vfh_example3.jpg | Bin 0 -> 9447 bytes .../content/images/visualization_small.png | Bin 0 -> 38482 bytes doc/tutorials/content/images/voxel_grid.jpg | Bin 0 -> 7064 bytes .../images/windows/SVNCheckout_pcl_trunk.png | Bin 0 -> 29694 bytes .../content/images/windows/cmake_boost.png | Bin 0 -> 18257 bytes .../images/windows/cmake_boost_found.png | Bin 0 -> 58662 bytes .../images/windows/cmake_configure_error.png | Bin 0 -> 120391 bytes .../windows/cmake_configure_noerror.png | Bin 0 -> 131065 bytes .../windows/cmake_eigen_include_dir.png | Bin 0 -> 5583 bytes .../content/images/windows/cmake_flann.png | Bin 0 -> 9792 bytes .../images/windows/cmake_generator.png | Bin 0 -> 47677 bytes .../images/windows/cmake_grouped_advanced.png | Bin 0 -> 100081 bytes .../content/images/windows/cmake_openni.png | Bin 0 -> 6779 bytes .../content/images/windows/cmake_pcl.png | Bin 0 -> 7075 bytes .../content/images/windows/cmake_qhull.png | Bin 0 -> 8603 bytes .../images/windows/cmake_vtk_configure.png | Bin 0 -> 9087 bytes .../cmake_vtk_found_enable_visualization.png | Bin 0 -> 53505 bytes .../images/windows/msvc_build_build_all.jpg | Bin 0 -> 12425 bytes .../images/windows/msvc_build_install.jpg | Bin 0 -> 18531 bytes .../pcl_solution_with_projects_folder.png | Bin 0 -> 113425 bytes .../pcl_solution_without_projects_folder.png | Bin 0 -> 26433 bytes doc/tutorials/content/images/windows_logo.png | Bin 0 -> 71185 bytes doc/tutorials/content/images/write_pcd.jpg | Bin 0 -> 8565 bytes doc/tutorials/content/index.rst | 864 + doc/tutorials/content/installing_homebrew.rst | 324 + .../content/iterative_closest_point.rst | 114 + doc/tutorials/content/kdtree_search.rst | 148 + .../content/narf_descriptor_visualization.rst | 65 + .../content/narf_feature_extraction.rst | 102 + .../content/narf_keypoint_extraction.rst | 87 + doc/tutorials/content/normal_estimation.rst | 258 + ...ormal_estimation_using_integral_images.rst | 112 + doc/tutorials/content/octree.rst | 124 + doc/tutorials/content/octree_change.rst | 135 + doc/tutorials/content/openni_grabber.rst | 210 + doc/tutorials/content/passthrough.rst | 89 + doc/tutorials/content/pcd_file_format.rst | 475 + doc/tutorials/content/pcl_visualizer.rst | 580 + doc/tutorials/content/pfh_estimation.rst | 195 + doc/tutorials/content/planar_segmentation.rst | 133 + doc/tutorials/content/project_inliers.rst | 103 + .../content/radius_outlier_removal.rst | 64 + .../content/random_sample_consensus.rst | 126 + .../content/range_image_border_extraction.rst | 88 + .../content/range_image_creation.rst | 79 + .../content/range_image_visualization.rst | 113 + doc/tutorials/content/reading_pcd.rst | 83 + doc/tutorials/content/registration_api.rst | 183 + doc/tutorials/content/remove_outliers.rst | 101 + doc/tutorials/content/resampling.rst | 118 + doc/tutorials/content/sources/CMakeLists.txt | 52 + .../sources/cloud_viewer/CMakeLists.txt | 12 + .../sources/cloud_viewer/cloud_viewer.cpp | 61 + .../sources/cluster_extraction/CMakeLists.txt | 12 + .../cluster_extraction/cluster_extraction.cpp | 102 + .../sources/concatenate_clouds/CMakeLists.txt | 12 + .../concatenate_clouds/concatenate_clouds.cpp | 82 + .../sources/concatenate_fields/CMakeLists.txt | 12 + .../concatenate_fields/concatenate_fields.cpp | 48 + .../sources/concatenate_points/CMakeLists.txt | 12 + .../concatenate_points/concatenate_points.cpp | 48 + .../sources/concave_hull_2d/CMakeLists.txt | 12 + .../concave_hull_2d/concave_hull_2d.cpp | 68 + .../conditional_removal/CMakeLists.txt | 12 + .../conditional_removal.cpp | 51 + .../sources/convex_hull_2d/CMakeLists.txt | 12 + .../sources/convex_hull_2d/convex_hull_2d.cpp | 59 + .../cylinder_segmentation/CMakeLists.txt | 14 + .../cylinder_segmentation.cpp | 113 + .../sources/extract_indices/CMakeLists.txt | 14 + .../extract_indices/extract_indices.cpp | 85 + .../sources/greedy_projection/CMakeLists.txt | 12 + .../greedy_projection/greedy_projection.cpp | 63 + .../content/sources/iccv2011/CMakeLists.txt | 42 + .../iccv2011/include/feature_estimation.h | 141 + .../sources/iccv2011/include/filters.h | 64 + .../sources/iccv2011/include/load_clouds.h | 70 + .../iccv2011/include/object_recognition.h | 202 + .../sources/iccv2011/include/openni_capture.h | 34 + .../sources/iccv2011/include/registration.h | 94 + .../sources/iccv2011/include/segmentation.h | 106 + .../sources/iccv2011/include/surface.h | 130 + .../sources/iccv2011/include/typedefs.h | 33 + .../iccv2011/src/build_all_object_models.cpp | 246 + .../iccv2011/src/build_object_model.cpp | 178 + .../sources/iccv2011/src/capture_tool.cpp | 36 + .../iccv2011/src/correspondence_viewer.cpp | 174 + .../sources/iccv2011/src/openni_capture.cpp | 115 + .../iccv2011/src/test_feature_estimation.cpp | 141 + .../sources/iccv2011/src/test_filters.cpp | 76 + .../iccv2011/src/test_object_recognition.cpp | 189 + .../iccv2011/src/test_registration.cpp | 102 + .../iccv2011/src/test_segmentation.cpp | 98 + .../sources/iccv2011/src/test_surface.cpp | 134 + .../content/sources/iccv2011/src/tutorial.cpp | 659 + .../content/sources/iros2011/CMakeLists.txt | 39 + .../iros2011/include/feature_estimation.h | 112 + .../sources/iros2011/include/filters.h | 34 + .../sources/iros2011/include/load_clouds.h | 70 + .../iros2011/include/object_recognition.h | 159 + .../sources/iros2011/include/openni_capture.h | 34 + .../sources/iros2011/include/registration.h | 65 + .../sources/iros2011/include/segmentation.h | 68 + .../include/solution/feature_estimation.h | 142 + .../iros2011/include/solution/filters.h | 64 + .../include/solution/object_recognition.h | 202 + .../include/solution/openni_capture.h | 34 + .../iros2011/include/solution/registration.h | 94 + .../iros2011/include/solution/segmentation.h | 106 + .../iros2011/include/solution/surface.h | 130 + .../iros2011/include/solution/typedefs.h | 33 + .../sources/iros2011/include/surface.h | 70 + .../sources/iros2011/include/typedefs.h | 40 + .../iros2011/src/build_all_object_models.cpp | 246 + .../iros2011/src/build_object_model.cpp | 178 + .../sources/iros2011/src/capture_tool.cpp | 36 + .../iros2011/src/correspondence_viewer.cpp | 174 + .../sources/iros2011/src/openni_capture.cpp | 118 + .../iros2011/src/test_feature_estimation.cpp | 141 + .../sources/iros2011/src/test_filters.cpp | 76 + .../iros2011/src/test_object_recognition.cpp | 189 + .../iros2011/src/test_registration.cpp | 102 + .../iros2011/src/test_segmentation.cpp | 98 + .../sources/iros2011/src/test_surface.cpp | 134 + .../iterative_closest_point/CMakeLists.txt | 14 + .../iterative_closest_point.cpp | 47 + .../sources/kdtree_search/CMakeLists.txt | 12 + .../sources/kdtree_search/kdtree_search.cpp | 82 + .../CMakeLists.txt | 13 + .../narf_descriptor_visualization.cpp | 244 + .../narf_feature_extraction/CMakeLists.txt | 13 + .../narf_feature_extraction.cpp | 227 + .../narf_keypoint_extraction/CMakeLists.txt | 13 + .../narf_keypoint_extraction.cpp | 208 + .../CMakeLists.txt | 13 + ...ormal_estimation_using_integral_images.cpp | 34 + .../octree_change_detection/CMakeLists.txt | 12 + .../octree_change_detection.cpp | 71 + .../sources/octree_search/CMakeLists.txt | 12 + .../sources/octree_search/octree_search.cpp | 100 + .../sources/openni_grabber/CMakeLists.txt | 12 + .../sources/openni_grabber/openni_grabber.cpp | 51 + .../CMakeLists.txt | 13 + .../openni_narf_keypoint_extraction.cpp | 218 + .../CMakeLists.txt | 13 + .../openni_range_image_visualization.cpp | 152 + .../sources/passthrough/CMakeLists.txt | 12 + .../sources/passthrough/passthrough.cpp | 44 + .../content/sources/pcd_read/CMakeLists.txt | 12 + .../content/sources/pcd_read/pcd_read.cpp | 25 + .../content/sources/pcd_write/CMakeLists.txt | 12 + .../content/sources/pcd_write/pcd_write.cpp | 30 + .../sources/pcl_visualizer/CMakeLists.txt | 12 + .../pcl_visualizer/CMakeLists.txt.simple | 0 .../pcl_visualizer/pcl_visualizer_demo.cpp | 381 + .../pcl_visualizer/pcl_visualizer_simple.cpp | 0 .../planar_segmentation/CMakeLists.txt | 12 + .../planar_segmentation.cpp | 70 + .../point_cloud_compression/CMakeLists.txt | 12 + .../point_cloud_compression.cpp | 99 + .../sources/project_inliers/CMakeLists.txt | 12 + .../project_inliers/project_inliers.cpp | 52 + .../radius_outlier_removal/CMakeLists.txt | 12 + .../radius_outlier_removal.cpp | 44 + .../random_sample_consensus/CMakeLists.txt | 12 + .../random_sample_consensus.cpp | 103 + .../CMakeLists.txt | 13 + .../range_image_border_extraction.cpp | 190 + .../range_image_creation/CMakeLists.txt | 12 + .../range_image_creation.cpp | 34 + .../range_image_visualization/CMakeLists.txt | 13 + .../range_image_visualization.cpp | 174 + .../sources/remove_outliers/CMakeLists.txt | 12 + .../remove_outliers/remove_outliers.cpp | 69 + .../content/sources/resampling/CMakeLists.txt | 12 + .../content/sources/resampling/resampling.cpp | 36 + .../sac_model_registration/CMakeLists.txt | 12 + .../sac_model_registration.cpp | 81 + .../statistical_removal/CMakeLists.txt | 12 + .../statistical_removal.cpp | 38 + .../sources/stick_segmentation/CMakeLists.txt | 12 + .../stick_segmentation/stick_segmentation.cpp | 255 + .../sources/template_alignment/CMakeLists.txt | 12 + .../template_alignment/template_alignment.cpp | 306 + .../sources/vfh_recognition/CMakeLists.txt | 29 + .../sources/vfh_recognition/FindFlann.cmake | 69 + .../sources/vfh_recognition/build_tree.cpp | 137 + .../vfh_recognition/nearest_neighbors.cpp | 274 + .../content/sources/voxel_grid/CMakeLists.txt | 12 + .../content/sources/voxel_grid/voxel_grid.cpp | 34 + doc/tutorials/content/statistical_outlier.rst | 133 + doc/tutorials/content/template_alignment.rst | 223 + .../content/using_pcl_pcl_config.rst | 208 + doc/tutorials/content/vfh_estimation.rst | 132 + doc/tutorials/content/vfh_recognition.rst | 325 + doc/tutorials/content/voxel_grid.rst | 77 + doc/tutorials/content/writing_new_classes.rst | 1300 + doc/tutorials/content/writing_pcd.rst | 111 + examples/CMakeLists.txt | 31 + examples/common/CMakeLists.txt | 9 + .../example_check_if_point_is_valid.cpp | 56 + examples/common/example_copy_point_cloud.cpp | 133 + .../example_get_max_min_coordinates.cpp | 21 + .../common/example_organized_point_cloud.cpp | 72 + examples/common/example_scope_time.cpp | 60 + examples/features/CMakeLists.txt | 20 + .../example_fast_point_feature_histograms.cpp | 109 + .../features/example_normal_estimation.cpp | 84 + .../example_point_feature_histograms.cpp | 103 + ...xample_principal_curvatures_estimation.cpp | 103 + examples/features/example_rift_estimation.cpp | 112 + examples/features/example_shape_contexts.cpp | 100 + examples/features/example_spin_images.cpp | 95 + examples/filters/CMakeLists.txt | 5 + examples/filters/example_extract_indices.cpp | 75 + .../example_remove_nan_from_point_cloud.cpp | 74 + examples/keypoints/CMakeLists.txt | 22 + .../example_sift_keypoint_estimation.cpp | 111 + ...xample_sift_normal_keypoint_estimation.cpp | 131 + .../example_sift_z_keypoint_estimation.cpp | 123 + examples/segmentation/CMakeLists.txt | 2 + .../example_extract_clusters_normals.cpp | 114 + features/CMakeLists.txt | 134 + features/features.doxy | 48 + features/include/pcl/features/3dsc.h | 305 + features/include/pcl/features/boundary.h | 231 + features/include/pcl/features/cvfh.h | 295 + features/include/pcl/features/esf.h | 144 + features/include/pcl/features/feature.h | 504 + features/include/pcl/features/fpfh.h | 287 + features/include/pcl/features/fpfh_omp.h | 141 + features/include/pcl/features/impl/3dsc.hpp | 361 + .../include/pcl/features/impl/boundary.hpp | 232 + features/include/pcl/features/impl/cvfh.hpp | 336 + features/include/pcl/features/impl/esf.hpp | 563 + .../include/pcl/features/impl/feature.hpp | 370 + features/include/pcl/features/impl/fpfh.hpp | 376 + .../include/pcl/features/impl/fpfh_omp.hpp | 147 + .../pcl/features/impl/integral_image2D.hpp | 384 + .../features/impl/integral_image_normal.hpp | 1143 + .../pcl/features/impl/intensity_gradient.hpp | 287 + .../pcl/features/impl/intensity_spin.hpp | 239 + .../pcl/features/impl/moment_invariants.hpp | 211 + .../impl/multiscale_feature_persistence.hpp | 250 + features/include/pcl/features/impl/narf.hpp | 105 + .../include/pcl/features/impl/normal_3d.hpp | 160 + .../pcl/features/impl/normal_3d_omp.hpp | 143 + .../features/impl/normal_based_signature.hpp | 188 + features/include/pcl/features/impl/pfh.hpp | 286 + features/include/pcl/features/impl/pfhrgb.hpp | 171 + features/include/pcl/features/impl/ppf.hpp | 181 + features/include/pcl/features/impl/ppfrgb.hpp | 146 + .../features/impl/principal_curvatures.hpp | 217 + .../impl/range_image_border_extractor.hpp | 401 + features/include/pcl/features/impl/rift.hpp | 265 + features/include/pcl/features/impl/rsd.hpp | 293 + features/include/pcl/features/impl/shot.hpp | 1719 + .../include/pcl/features/impl/shot_lrf.hpp | 240 + .../pcl/features/impl/shot_lrf_omp.hpp | 138 + .../include/pcl/features/impl/shot_omp.hpp | 468 + .../include/pcl/features/impl/spin_image.hpp | 371 + ..._multiscale_interest_region_extraction.hpp | 250 + features/include/pcl/features/impl/usc.hpp | 274 + features/include/pcl/features/impl/vfh.hpp | 287 + .../include/pcl/features/integral_image2D.h | 345 + .../pcl/features/integral_image_normal.h | 415 + .../include/pcl/features/intensity_gradient.h | 156 + .../include/pcl/features/intensity_spin.h | 192 + .../include/pcl/features/moment_invariants.h | 155 + .../features/multiscale_feature_persistence.h | 199 + features/include/pcl/features/narf.h | 286 + .../include/pcl/features/narf_descriptor.h | 110 + features/include/pcl/features/normal_3d.h | 408 + features/include/pcl/features/normal_3d_omp.h | 157 + .../pcl/features/normal_based_signature.h | 165 + features/include/pcl/features/pfh.h | 310 + features/include/pcl/features/pfhrgb.h | 107 + features/include/pcl/features/ppf.h | 147 + features/include/pcl/features/ppfrgb.h | 69 + .../pcl/features/principal_curvatures.h | 178 + .../features/range_image_border_extractor.h | 365 + features/include/pcl/features/rift.h | 202 + features/include/pcl/features/rsd.h | 230 + features/include/pcl/features/shot.h | 898 + features/include/pcl/features/shot_lrf.h | 113 + features/include/pcl/features/shot_lrf_omp.h | 119 + features/include/pcl/features/shot_omp.h | 326 + features/include/pcl/features/spin_image.h | 358 + ...al_multiscale_interest_region_extraction.h | 126 + features/include/pcl/features/usc.h | 260 + features/include/pcl/features/vfh.h | 321 + features/src/3dsc.cpp | 53 + features/src/boundary.cpp | 51 + features/src/cvfh.cpp | 51 + features/src/esf.cpp | 50 + features/src/fpfh.cpp | 52 + features/src/fpfh_omp.cpp | 50 + features/src/integral_image_normal.cpp | 48 + features/src/intensity_gradient.cpp | 51 + features/src/intensity_spin.cpp | 52 + features/src/moment_invariants.cpp | 52 + .../src/multiscale_feature_persistence.cpp | 50 + features/src/narf.cpp | 604 + features/src/narf_descriptor.cpp | 137 + features/src/normal_3d.cpp | 52 + features/src/normal_3d_omp.cpp | 52 + features/src/normal_based_signature.cpp | 49 + features/src/pfh.cpp | 113 + features/src/pfhrgb.cpp | 113 + features/src/ppf.cpp | 73 + features/src/ppfrgb.cpp | 52 + features/src/principal_curvatures.cpp | 52 + features/src/range_image_border_extractor.cpp | 687 + features/src/rift.cpp | 51 + features/src/rsd.cpp | 51 + features/src/shot.cpp | 57 + features/src/shot_lrf.cpp | 46 + features/src/shot_lrf_omp.cpp | 46 + features/src/shot_omp.cpp | 51 + features/src/spin_image.cpp | 50 + ..._multiscale_interest_region_extraction.cpp | 48 + features/src/usc.cpp | 51 + features/src/vfh.cpp | 50 + features/test/CMakeLists.txt | 3 + features/test/test_narf.cpp | 87 + filters/CMakeLists.txt | 83 + filters/filters.doxy | 32 + .../pcl/filters/approximate_voxel_grid.h | 232 + filters/include/pcl/filters/bilateral.h | 151 + filters/include/pcl/filters/clipper3D.h | 111 + .../include/pcl/filters/conditional_removal.h | 686 + filters/include/pcl/filters/crop_box.h | 329 + filters/include/pcl/filters/crop_hull.h | 235 + filters/include/pcl/filters/extract_indices.h | 196 + filters/include/pcl/filters/filter.h | 221 + filters/include/pcl/filters/filter_indices.h | 319 + .../filters/impl/approximate_voxel_grid.hpp | 137 + .../include/pcl/filters/impl/bilateral.hpp | 111 + .../pcl/filters/impl/conditional_removal.hpp | 799 + filters/include/pcl/filters/impl/crop_box.hpp | 160 + .../include/pcl/filters/impl/crop_hull.hpp | 329 + .../pcl/filters/impl/extract_indices.hpp | 155 + filters/include/pcl/filters/impl/filter.hpp | 94 + .../pcl/filters/impl/filter_indices.hpp | 80 + .../include/pcl/filters/impl/normal_space.hpp | 321 + .../include/pcl/filters/impl/passthrough.hpp | 158 + .../pcl/filters/impl/plane_clipper3D.hpp | 216 + .../pcl/filters/impl/project_inliers.hpp | 166 + .../filters/impl/radius_outlier_removal.hpp | 127 + .../pcl/filters/impl/random_sample.hpp | 145 + .../impl/statistical_outlier_removal.hpp | 148 + .../include/pcl/filters/impl/voxel_grid.hpp | 398 + filters/include/pcl/filters/normal_space.h | 187 + filters/include/pcl/filters/passthrough.h | 374 + filters/include/pcl/filters/plane_clipper3D.h | 97 + filters/include/pcl/filters/project_inliers.h | 277 + .../pcl/filters/radius_outlier_removal.h | 265 + filters/include/pcl/filters/random_sample.h | 224 + .../pcl/filters/statistical_outlier_removal.h | 296 + filters/include/pcl/filters/voxel_grid.h | 802 + filters/src/approximate_voxel_grid.cpp | 47 + filters/src/bilateral.cpp | 43 + filters/src/conditional_removal.cpp | 54 + filters/src/crop_box.cpp | 170 + filters/src/crop_hull.cpp | 44 + filters/src/extract_indices.cpp | 156 + filters/src/filter.cpp | 80 + filters/src/filter_indices.cpp | 63 + filters/src/normal_space.cpp | 44 + filters/src/passthrough.cpp | 281 + filters/src/project_inliers.cpp | 257 + filters/src/radius_outlier_removal.cpp | 122 + filters/src/random_sample.cpp | 145 + filters/src/statistical_outlier_removal.cpp | 165 + filters/src/voxel_grid.cpp | 531 + filters/test/CMakeLists.txt | 0 filters/tools/CMakeLists.txt | 0 geometry/CMakeLists.txt | 39 + geometry/geometry.doxy | 11 + .../pcl/geometry/impl/polygon_operations.hpp | 299 + geometry/include/pcl/geometry/line_iterator.h | 275 + .../pcl/geometry/organized_index_iterator.h | 153 + .../include/pcl/geometry/planar_polygon.h | 112 + .../include/pcl/geometry/polygon_operations.h | 71 + geometry/src/geometry.cpp | 0 geometry/test/CMakeLists.txt | 3 + geometry/test/test_iterator.cpp | 292 + io/CMakeLists.txt | 160 + io/include/pcl/compression/color_coding.h | 421 + .../pcl/compression/compression_profiles.h | 185 + .../pcl/compression/entropy_range_coder.h | 192 + .../compression/impl/entropy_range_coder.hpp | 682 + .../impl/octree_pointcloud_compression.hpp | 565 + .../octree_pointcloud_compression.h | 303 + io/include/pcl/compression/point_coding.h | 215 + io/include/pcl/io/file_io.h | 387 + io/include/pcl/io/grabber.h | 274 + io/include/pcl/io/impl/pcd_io.hpp | 872 + io/include/pcl/io/impl/vtk_lib_io.hpp | 478 + io/include/pcl/io/io.h | 46 + io/include/pcl/io/lzf.h | 92 + io/include/pcl/io/obj_io.h | 71 + io/include/pcl/io/oni_grabber.h | 197 + .../pcl/io/openni_camera/openni_depth_image.h | 248 + .../pcl/io/openni_camera/openni_device.h | 555 + .../io/openni_camera/openni_device_kinect.h | 87 + .../pcl/io/openni_camera/openni_device_oni.h | 100 + .../openni_camera/openni_device_primesense.h | 73 + .../io/openni_camera/openni_device_xtion.h | 74 + .../pcl/io/openni_camera/openni_driver.h | 253 + .../pcl/io/openni_camera/openni_exception.h | 140 + .../pcl/io/openni_camera/openni_image.h | 209 + .../openni_camera/openni_image_bayer_grbg.h | 103 + .../pcl/io/openni_camera/openni_image_rgb24.h | 82 + .../io/openni_camera/openni_image_yuv_422.h | 79 + .../pcl/io/openni_camera/openni_ir_image.h | 106 + io/include/pcl/io/openni_grabber.h | 301 + io/include/pcl/io/pcd_grabber.h | 212 + io/include/pcl/io/pcd_io.h | 758 + io/include/pcl/io/pcl_io_exception.h | 94 + io/include/pcl/io/ply/byte_order.h | 123 + io/include/pcl/io/ply/io_operators.h | 102 + io/include/pcl/io/ply/ply.h | 101 + io/include/pcl/io/ply/ply_parser.h | 703 + io/include/pcl/io/ply_io.h | 780 + io/include/pcl/io/tar.h | 84 + io/include/pcl/io/vtk_io.h | 75 + io/include/pcl/io/vtk_lib_io.h | 223 + io/io.doxy | 35 + io/src/compression.cpp | 53 + io/src/lzf.cpp | 394 + io/src/obj_io.cpp | 378 + io/src/oni_grabber.cpp | 641 + io/src/openni_camera/openni_depth_image.cpp | 193 + io/src/openni_camera/openni_device.cpp | 1164 + io/src/openni_camera/openni_device_kinect.cpp | 121 + io/src/openni_camera/openni_device_oni.cpp | 218 + .../openni_device_primesense.cpp | 266 + io/src/openni_camera/openni_device_xtion.cpp | 134 + io/src/openni_camera/openni_driver.cpp | 546 + io/src/openni_camera/openni_exception.cpp | 88 + .../openni_camera/openni_image_bayer_grbg.cpp | 1424 + io/src/openni_camera/openni_image_rgb24.cpp | 114 + io/src/openni_camera/openni_image_yuv_422.cpp | 152 + io/src/openni_camera/openni_ir_image.cpp | 93 + io/src/openni_grabber.cpp | 987 + io/src/pcd_grabber.cpp | 354 + io/src/pcd_io.cpp | 2414 + io/src/ply/ply_parser.cpp | 606 + io/src/ply_io.cpp | 1267 + io/src/vtk_io.cpp | 235 + io/src/vtk_lib_io.cpp | 432 + io/test/CMakeLists.txt | 13 + io/test/test_io.cpp | 1274 + io/test/test_iterators.cpp | 84 + io/test/test_range_coder.cpp | 180 + io/tools/CMakeLists.txt | 14 + io/tools/convert_pcd_ascii_binary.cpp | 94 + io/tools/openni_grabber_example.cpp | 140 + io/tools/openni_io.cpp | 205 + io/tools/pcd_convert_NaN_nan.cpp | 81 + io/tools/ply/CMakeLists.txt | 11 + io/tools/ply/ply2obj.cpp | 469 + io/tools/ply/ply2ply.cpp | 563 + io/tools/ply/ply2raw.cpp | 462 + io/tools/ply/plyheader.cpp | 189 + kdtree/CMakeLists.txt | 44 + kdtree/include/pcl/kdtree/flann.h | 59 + kdtree/include/pcl/kdtree/impl/io.hpp | 87 + .../include/pcl/kdtree/impl/kdtree_flann.hpp | 254 + kdtree/include/pcl/kdtree/io.h | 79 + kdtree/include/pcl/kdtree/kdtree.h | 374 + kdtree/include/pcl/kdtree/kdtree_flann.h | 755 + kdtree/kdtree.doxy | 21 + kdtree/src/kdtree_flann.cpp | 45 + kdtree/test/CMakeLists.txt | 3 + kdtree/test/test_kdtree.cpp | 409 + keypoints/CMakeLists.txt | 52 + .../include/pcl/keypoints/harris_keypoint3D.h | 178 + .../pcl/keypoints/impl/harris_keypoint3D.hpp | 514 + .../include/pcl/keypoints/impl/keypoint.hpp | 140 + .../pcl/keypoints/impl/sift_keypoint.hpp | 324 + .../impl/smoothed_surfaces_keypoint.hpp | 248 + .../pcl/keypoints/impl/uniform_sampling.hpp | 128 + keypoints/include/pcl/keypoints/keypoint.h | 196 + .../include/pcl/keypoints/narf_keypoint.h | 200 + .../include/pcl/keypoints/sift_keypoint.h | 203 + .../keypoints/smoothed_surfaces_keypoint.h | 132 + .../include/pcl/keypoints/uniform_sampling.h | 136 + keypoints/keypoints.doxy | 23 + keypoints/src/harris_keypoint3D.cpp | 45 + keypoints/src/narf_keypoint.cpp | 959 + keypoints/src/sift_keypoint.cpp | 45 + keypoints/src/smoothed_surfaces_keypoint.cpp | 45 + keypoints/src/uniform_sampling.cpp | 45 + keypoints/test/CMakeLists.txt | 0 octree/CMakeLists.txt | 58 + .../pcl/octree/impl/octree2buf_base.hpp | 875 + .../include/pcl/octree/impl/octree_base.hpp | 653 + .../pcl/octree/impl/octree_iterator.hpp | 330 + .../pcl/octree/impl/octree_pointcloud.hpp | 772 + .../include/pcl/octree/impl/octree_search.hpp | 868 + octree/include/pcl/octree/octree.h | 57 + octree/include/pcl/octree/octree2buf_base.h | 949 + octree/include/pcl/octree/octree_base.h | 697 + octree/include/pcl/octree/octree_container.h | 310 + octree/include/pcl/octree/octree_impl.h | 50 + octree/include/pcl/octree/octree_iterator.h | 477 + octree/include/pcl/octree/octree_key.h | 142 + octree/include/pcl/octree/octree_node_pool.h | 131 + octree/include/pcl/octree/octree_nodes.h | 271 + octree/include/pcl/octree/octree_pointcloud.h | 545 + .../octree/octree_pointcloud_changedetector.h | 104 + .../pcl/octree/octree_pointcloud_density.h | 180 + .../pcl/octree/octree_pointcloud_occupancy.h | 134 + .../octree/octree_pointcloud_pointvector.h | 97 + .../octree/octree_pointcloud_singlepoint.h | 98 + .../octree/octree_pointcloud_voxelcentroid.h | 238 + octree/include/pcl/octree/octree_search.h | 612 + octree/octree.doxy | 34 + octree/src/octree_impl.cpp | 80 + octree/test/CMakeLists.txt | 4 + octree/test/test_octree.cpp | 1610 + pcl_config.h.in | 47 + registration/CMakeLists.txt | 108 + .../registration/correspondence_estimation.h | 149 + ...orrespondence_estimation_normal_shooting.h | 133 + .../registration/correspondence_rejection.h | 278 + .../correspondence_rejection_distance.h | 145 + .../correspondence_rejection_features.h | 292 + ...correspondence_rejection_median_distance.h | 153 + .../correspondence_rejection_one_to_one.h | 94 + ...orrespondence_rejection_sample_consensus.h | 160 + .../correspondence_rejection_surface_normal.h | 174 + .../correspondence_rejection_trimmed.h | 138 + .../correspondence_rejection_var_trimmed.h | 192 + .../pcl/registration/correspondence_sorting.h | 125 + .../pcl/registration/correspondence_types.h | 75 + .../include/pcl/registration/distances.h | 144 + registration/include/pcl/registration/elch.h | 257 + .../include/pcl/registration/exceptions.h | 69 + registration/include/pcl/registration/gicp.h | 340 + .../include/pcl/registration/ia_ransac.h | 271 + registration/include/pcl/registration/icp.h | 141 + .../include/pcl/registration/icp_nl.h | 88 + .../impl/correspondence_estimation.hpp | 170 + ...respondence_estimation_normal_shooting.hpp | 105 + .../correspondence_rejection_distance.hpp | 71 + .../correspondence_rejection_features.hpp | 145 + ...rrespondence_rejection_median_distance.hpp | 80 + .../correspondence_rejection_one_to_one.hpp | 69 + ...respondence_rejection_sample_consensus.hpp | 112 + ...orrespondence_rejection_surface_normal.hpp | 62 + .../impl/correspondence_rejection_trimmed.hpp | 61 + .../correspondence_rejection_var_trimmed.hpp | 108 + .../impl/correspondence_types.hpp | 76 + .../include/pcl/registration/impl/elch.hpp | 276 + .../include/pcl/registration/impl/gicp.hpp | 466 + .../pcl/registration/impl/ia_ransac.hpp | 239 + .../include/pcl/registration/impl/icp.hpp | 212 + .../include/pcl/registration/impl/icp_nl.hpp | 43 + .../registration/impl/ppf_registration.hpp | 348 + .../impl/pyramid_feature_matching.hpp | 311 + .../pcl/registration/impl/registration.hpp | 169 + .../impl/transformation_estimation_lm.hpp | 290 + ...ormation_estimation_point_to_plane_lls.hpp | 245 + .../impl/transformation_estimation_svd.hpp | 196 + .../transformation_validation_euclidean.hpp | 95 + .../pcl/registration/ppf_registration.h | 288 + .../registration/pyramid_feature_matching.h | 195 + .../include/pcl/registration/registration.h | 389 + .../registration/transformation_estimation.h | 126 + .../transformation_estimation_lm.h | 332 + ...transformation_estimation_point_to_plane.h | 88 + ...sformation_estimation_point_to_plane_lls.h | 138 + .../transformation_estimation_svd.h | 135 + .../registration/transformation_validation.h | 102 + .../transformation_validation_euclidean.h | 139 + .../include/pcl/registration/transforms.h | 41 + .../pcl/registration/warp_point_rigid.h | 85 + .../pcl/registration/warp_point_rigid_3d.h | 74 + .../pcl/registration/warp_point_rigid_6d.h | 74 + registration/registration.doxy | 27 + .../src/correspondence_estimation.cpp | 38 + ...respondence_estimation_normal_shooting.cpp | 38 + .../src/correspondence_rejection_distance.cpp | 38 + .../src/correspondence_rejection_features.cpp | 38 + ...rrespondence_rejection_median_distance.cpp | 38 + .../correspondence_rejection_one_to_one.cpp | 38 + ...respondence_rejection_sample_consensus.cpp | 38 + ...orrespondence_rejection_surface_normal.cpp | 38 + .../src/correspondence_rejection_trimmed.cpp | 38 + .../correspondence_rejection_var_trimmed.cpp | 38 + registration/src/correspondence_types.cpp | 39 + registration/src/icp.cpp | 38 + registration/src/icp_nl.cpp | 38 + registration/src/ppf_registration.cpp | 45 + registration/src/pyramid_feature_matching.cpp | 44 + registration/src/registration.cpp | 57 + .../src/transformation_estimation_lm.cpp | 38 + ...ormation_estimation_point_to_plane_lls.cpp | 38 + .../src/transformation_estimation_svd.cpp | 38 + .../transformation_validation_euclidean.cpp | 38 + remove_quotes.sh | 19 + sample_consensus/CMakeLists.txt | 99 + .../pcl/sample_consensus/impl/lmeds.hpp | 178 + .../pcl/sample_consensus/impl/mlesac.hpp | 291 + .../pcl/sample_consensus/impl/msac.hpp | 163 + .../pcl/sample_consensus/impl/prosac.hpp | 235 + .../pcl/sample_consensus/impl/ransac.hpp | 138 + .../pcl/sample_consensus/impl/rmsac.hpp | 181 + .../pcl/sample_consensus/impl/rransac.hpp | 148 + .../impl/sac_model_circle.hpp | 338 + .../sample_consensus/impl/sac_model_cone.hpp | 523 + .../impl/sac_model_cylinder.hpp | 468 + .../sample_consensus/impl/sac_model_line.hpp | 322 + .../impl/sac_model_normal_parallel_plane.hpp | 205 + .../impl/sac_model_normal_plane.hpp | 189 + .../impl/sac_model_normal_sphere.hpp | 224 + .../impl/sac_model_parallel_line.hpp | 117 + .../impl/sac_model_parallel_plane.hpp | 115 + .../impl/sac_model_perpendicular_plane.hpp | 117 + .../sample_consensus/impl/sac_model_plane.hpp | 355 + .../impl/sac_model_registration.hpp | 293 + .../impl/sac_model_sphere.hpp | 304 + .../sample_consensus/impl/sac_model_stick.hpp | 357 + .../include/pcl/sample_consensus/lmeds.h | 95 + .../pcl/sample_consensus/method_types.h | 52 + .../include/pcl/sample_consensus/mlesac.h | 155 + .../pcl/sample_consensus/model_types.h | 93 + .../include/pcl/sample_consensus/msac.h | 95 + .../include/pcl/sample_consensus/prosac.h | 97 + .../include/pcl/sample_consensus/ransac.h | 97 + .../include/pcl/sample_consensus/rmsac.h | 110 + .../include/pcl/sample_consensus/rransac.h | 110 + .../include/pcl/sample_consensus/sac.h | 226 + .../include/pcl/sample_consensus/sac_model.h | 597 + .../pcl/sample_consensus/sac_model_circle.h | 241 + .../pcl/sample_consensus/sac_model_cone.h | 343 + .../pcl/sample_consensus/sac_model_cylinder.h | 333 + .../pcl/sample_consensus/sac_model_line.h | 185 + .../sac_model_normal_parallel_plane.h | 225 + .../sample_consensus/sac_model_normal_plane.h | 152 + .../sac_model_normal_sphere.h | 146 + .../sac_model_parallel_line.h | 159 + .../sac_model_parallel_plane.h | 166 + .../sac_model_perpendicular_plane.h | 169 + .../pcl/sample_consensus/sac_model_plane.h | 259 + .../sample_consensus/sac_model_registration.h | 329 + .../pcl/sample_consensus/sac_model_sphere.h | 261 + .../pcl/sample_consensus/sac_model_stick.h | 188 + sample_consensus/sample_consensus.doxy | 51 + sample_consensus/src/lmeds.cpp | 50 + sample_consensus/src/mlesac.cpp | 50 + sample_consensus/src/msac.cpp | 50 + sample_consensus/src/prosac.cpp | 50 + sample_consensus/src/ransac.cpp | 50 + sample_consensus/src/rmsac.cpp | 50 + sample_consensus/src/rransac.cpp | 50 + sample_consensus/src/sac_model_circle.cpp | 50 + sample_consensus/src/sac_model_cone.cpp | 50 + sample_consensus/src/sac_model_cylinder.cpp | 50 + sample_consensus/src/sac_model_line.cpp | 50 + .../src/sac_model_normal_parallel_plane.cpp | 51 + .../src/sac_model_normal_plane.cpp | 51 + .../src/sac_model_normal_sphere.cpp | 51 + .../src/sac_model_parallel_line.cpp | 51 + .../src/sac_model_parallel_plane.cpp | 52 + .../src/sac_model_perpendicular_plane.cpp | 52 + sample_consensus/src/sac_model_plane.cpp | 51 + .../src/sac_model_registration.cpp | 51 + sample_consensus/src/sac_model_sphere.cpp | 50 + sample_consensus/src/sac_model_stick.cpp | 51 + search/CMakeLists.txt | 50 + search/include/pcl/search/brute_force.h | 145 + search/include/pcl/search/flann_search.h | 262 + .../include/pcl/search/impl/brute_force.hpp | 354 + .../include/pcl/search/impl/flann_search.hpp | 414 + search/include/pcl/search/impl/organized.hpp | 526 + search/include/pcl/search/kdtree.h | 181 + search/include/pcl/search/octree.h | 284 + search/include/pcl/search/organized.h | 281 + search/include/pcl/search/pcl_search.h | 49 + search/include/pcl/search/search.h | 525 + search/search.doxy | 19 + search/src/brute_force.cpp | 42 + search/src/kdtree.cpp | 45 + search/src/octree.cpp | 45 + search/src/organized.cpp | 46 + search/test/CMakeLists.txt | 14 + search/test/test_flann_search.cpp | 381 + search/test/test_kdtree.cpp | 210 + search/test/test_octree.cpp | 372 + search/test/test_organized.cpp | 339 + segmentation/CMakeLists.txt | 64 + .../include/pcl/segmentation/comparator.h | 103 + .../edge_aware_plane_comparator.h | 140 + .../euclidean_cluster_comparator.h | 201 + .../euclidean_plane_coefficient_comparator.h | 101 + .../pcl/segmentation/extract_clusters.h | 424 + .../segmentation/extract_labeled_clusters.h | 189 + .../extract_polygonal_prism_data.h | 193 + .../segmentation/impl/extract_clusters.hpp | 242 + .../impl/extract_labeled_clusters.hpp | 156 + .../impl/extract_polygonal_prism_data.hpp | 256 + ...nized_connected_component_segmentation.hpp | 231 + .../organized_multi_plane_segmentation.hpp | 420 + .../impl/planar_polygon_fusion.hpp | 48 + .../segmentation/impl/sac_segmentation.hpp | 497 + .../segmentation/impl/segment_differences.hpp | 137 + ...ganized_connected_component_segmentation.h | 151 + .../organized_multi_plane_segmentation.h | 320 + .../pcl/segmentation/planar_polygon_fusion.h | 86 + .../include/pcl/segmentation/planar_region.h | 111 + .../plane_coefficient_comparator.h | 215 + .../plane_refinement_comparator.h | 223 + .../include/pcl/segmentation/region_3d.h | 107 + .../rgb_plane_coefficient_comparator.h | 135 + .../pcl/segmentation/sac_segmentation.h | 407 + .../pcl/segmentation/segment_differences.h | 158 + segmentation/segmentation.doxy | 17 + segmentation/src/extract_clusters.cpp | 59 + .../src/extract_polygonal_prism_data.cpp | 54 + ...nized_connected_component_segmentation.cpp | 46 + .../organized_multi_plane_segmentation.cpp | 46 + segmentation/src/planar_polygon_fusion.cpp | 51 + segmentation/src/sac_segmentation.cpp | 52 + segmentation/src/segment_differences.cpp | 46 + surface/CMakeLists.txt | 159 + .../pcl/surface/bilateral_upsampling.h | 155 + surface/include/pcl/surface/concave_hull.h | 200 + surface/include/pcl/surface/convex_hull.h | 254 + surface/include/pcl/surface/ear_clipping.h | 126 + surface/include/pcl/surface/gp3.h | 547 + surface/include/pcl/surface/grid_projection.h | 504 + .../pcl/surface/impl/bilateral_upsampling.hpp | 156 + .../include/pcl/surface/impl/concave_hull.hpp | 609 + .../include/pcl/surface/impl/convex_hull.hpp | 473 + surface/include/pcl/surface/impl/gp3.hpp | 1681 + .../pcl/surface/impl/grid_projection.hpp | 780 + .../pcl/surface/impl/marching_cubes.hpp | 331 + .../pcl/surface/impl/marching_cubes_hoppe.hpp | 90 + .../pcl/surface/impl/marching_cubes_rbf.hpp | 135 + surface/include/pcl/surface/impl/mls.hpp | 615 + surface/include/pcl/surface/impl/mls_omp.hpp | 165 + .../pcl/surface/impl/organized_fast_mesh.hpp | 283 + surface/include/pcl/surface/impl/poisson.hpp | 312 + .../surface/impl/poisson/function_data.hpp | 397 + .../pcl/surface/impl/poisson/geometry.hpp | 617 + .../impl/poisson/multi_grid_octree_data.hpp | 3402 + .../surface/impl/poisson/octree_poisson.hpp | 2620 + .../pcl/surface/impl/poisson/polynomial.hpp | 304 + .../pcl/surface/impl/poisson/ppolynomial.hpp | 632 + .../surface/impl/poisson/sparse_matrix.hpp | 658 + .../pcl/surface/impl/poisson/vector.hpp | 509 + .../include/pcl/surface/impl/processing.hpp | 59 + .../pcl/surface/impl/reconstruction.hpp | 200 + .../pcl/surface/impl/surfel_smoothing.hpp | 317 + .../pcl/surface/impl/texture_mapping.hpp | 1087 + surface/include/pcl/surface/marching_cubes.h | 514 + .../pcl/surface/marching_cubes_hoppe.h | 87 + .../include/pcl/surface/marching_cubes_rbf.h | 110 + surface/include/pcl/surface/mls.h | 482 + surface/include/pcl/surface/mls_omp.h | 116 + .../include/pcl/surface/organized_fast_mesh.h | 324 + surface/include/pcl/surface/poisson.h | 235 + .../include/pcl/surface/poisson/allocator.h | 225 + .../include/pcl/surface/poisson/binary_node.h | 101 + surface/include/pcl/surface/poisson/factor.h | 68 + .../pcl/surface/poisson/function_data.h | 99 + .../include/pcl/surface/poisson/geometry.h | 307 + surface/include/pcl/surface/poisson/hash.h | 99 + .../surface/poisson/marching_cubes_poisson.h | 155 + .../surface/poisson/multi_grid_octree_data.h | 521 + .../pcl/surface/poisson/octree_poisson.h | 320 + .../include/pcl/surface/poisson/polynomial.h | 111 + .../include/pcl/surface/poisson/ppolynomial.h | 145 + .../pcl/surface/poisson/sparse_matrix.h | 202 + surface/include/pcl/surface/poisson/vector.h | 163 + surface/include/pcl/surface/processing.h | 139 + surface/include/pcl/surface/qhull.h | 75 + surface/include/pcl/surface/reconstruction.h | 238 + .../simplification_remove_unused_vertices.h | 81 + .../include/pcl/surface/surfel_smoothing.h | 111 + surface/include/pcl/surface/texture_mapping.h | 386 + .../include/pcl/surface/vtk_smoothing/vtk.h | 50 + .../vtk_mesh_smoothing_laplacian.h | 200 + .../vtk_mesh_smoothing_windowed_sinc.h | 199 + .../vtk_smoothing/vtk_mesh_subdivision.h | 88 + .../pcl/surface/vtk_smoothing/vtk_utils.h | 81 + surface/src/bilateral_upsampling.cpp | 49 + surface/src/concave_hull.cpp | 51 + surface/src/convex_hull.cpp | 49 + surface/src/ear_clipping.cpp | 185 + surface/src/gp3.cpp | 45 + surface/src/grid_projection.cpp | 47 + surface/src/marching_cubes.cpp | 42 + surface/src/marching_cubes_hoppe.cpp | 42 + surface/src/marching_cubes_rbf.cpp | 42 + surface/src/mls.cpp | 50 + surface/src/mls_omp.cpp | 51 + surface/src/organized_fast_mesh.cpp | 44 + surface/src/poisson.cpp | 44 + surface/src/poisson/factor.cpp | 286 + surface/src/poisson/geometry.cpp | 100 + .../src/poisson/marching_cubes_poisson.cpp | 1026 + surface/src/processing.cpp | 86 + .../simplification_remove_unused_vertices.cpp | 103 + surface/src/surfel_smoothing.cpp | 43 + surface/src/texture_mapping.cpp | 46 + .../vtk_mesh_smoothing_laplacian.cpp | 69 + .../vtk_mesh_smoothing_windowed_sinc.cpp | 68 + .../vtk_smoothing/vtk_mesh_subdivision.cpp | 88 + surface/src/vtk_smoothing/vtk_utils.cpp | 262 + surface/surface.doxy | 38 + test/CMakeLists.txt | 88 + test/bun0.pcd | 407 + test/bun4.pcd | 371 + test/bunny.pcd | 407 + test/cturtle.pcd | 167208 ++++++++ test/features/CMakeLists.txt | 47 + test/features/test_base_feature.cpp | 180 + test/features/test_boundary_estimation.cpp | 238 + test/features/test_curvatures_estimation.cpp | 264 + test/features/test_cvfh_estimation.cpp | 167 + test/features/test_gradient_estimation.cpp | 207 + test/features/test_invariants_estimation.cpp | 166 + test/features/test_normal_estimation.cpp | 330 + test/features/test_pfh_estimation.cpp | 932 + test/features/test_ppf_estimation.cpp | 128 + test/features/test_rift_estimation.cpp | 219 + test/features/test_shot_estimation.cpp | 1211 + test/features/test_spin_estimation.cpp | 538 + test/milk.pcd | 13715 + test/nhood_test.pcd | 46 + test/noisy_slice_displaced.pcd | 3793 + test/pcl_logo.pcd | 12920 + test/sac_plane_test.pcd | 3293 + test/table_scene_mug_stereo_textured.pcd | 307211 +++++++++++++++ test/test_auto_search.cpp | 357 + test/test_correspondence_estimation.cpp | 92 + test/test_filters.cpp | 1526 + test/test_ii_normals.cpp | 534 + test/test_keypoints.cpp | 181 + test/test_non_linear.cpp | 102 + test/test_organized_index.cpp | 686 + test/test_registration.cpp | 602 + test/test_registration_api.cpp | 387 + test/test_registration_api_data.h | 999 + test/test_sample_consensus.cpp | 903 + test/test_search.cpp | 644 + test/test_segmentation.cpp | 136 + test/test_surface.cpp | 1063 + test/test_transforms.cpp | 230 + tools/CMakeLists.txt | 132 + tools/add_gaussian_noise.cpp | 164 + tools/bilateral_upsampling.cpp | 169 + tools/boundary_estimation.cpp | 180 + tools/cluster_extraction.cpp | 191 + tools/compute_cloud_error.cpp | 259 + tools/concatenate_points_pcd.cpp | 112 + tools/convert_pcd_to_image.cpp | 49 + tools/crop_to_hull.cpp | 208 + tools/elch.cpp | 145 + tools/extract_feature.cpp | 205 + tools/fpfh_estimation.cpp | 174 + tools/gp3_surface.cpp | 169 + tools/icp.cpp | 138 + tools/icp2d.cpp | 136 + tools/marching_cubes_reconstruction.cpp | 206 + tools/mesh2pcd.cpp | 188 + tools/mesh_sampling.cpp | 249 + tools/mls_smoothing.cpp | 203 + tools/normal_estimation.cpp | 166 + tools/octree_viewer.cpp | 397 + tools/openni_save_image.cpp | 298 + tools/outlier_removal.cpp | 206 + tools/passthrough_filter.cpp | 166 + tools/pcd2ply.cpp | 119 + tools/pcd2vtk.cpp | 112 + tools/pcl_video.cpp | 437 + tools/plane_projection.cpp | 181 + tools/ply2pcd.cpp | 120 + tools/poisson_reconstruction.cpp | 187 + tools/registration_visualizer.cpp | 171 + tools/spin_estimation.cpp | 193 + tools/transform_from_viewpoint.cpp | 166 + tools/transform_point_cloud.cpp | 283 + tools/vfh_estimation.cpp | 145 + tools/virtual_scanner.cpp | 415 + tools/voxel_grid.cpp | 191 + tracking/CMakeLists.txt | 64 + ...pprox_nearest_pair_point_cloud_coherence.h | 51 + tracking/include/pcl/tracking/coherence.h | 136 + .../include/pcl/tracking/distance_coherence.h | 50 + .../pcl/tracking/hsv_color_coherence.h | 101 + ...rox_nearest_pair_point_cloud_coherence.hpp | 67 + .../include/pcl/tracking/impl/coherence.hpp | 58 + .../pcl/tracking/impl/distance_coherence.hpp | 23 + .../pcl/tracking/impl/hsv_color_coherence.hpp | 185 + .../impl/kld_adaptive_particle_filter.hpp | 92 + .../impl/kld_adaptive_particle_filter_omp.hpp | 77 + .../nearest_pair_point_cloud_coherence.hpp | 70 + .../pcl/tracking/impl/normal_coherence.hpp | 34 + .../pcl/tracking/impl/particle_filter.hpp | 413 + .../pcl/tracking/impl/particle_filter_omp.hpp | 77 + .../include/pcl/tracking/impl/tracker.hpp | 40 + .../include/pcl/tracking/impl/tracking.hpp | 782 + .../tracking/kld_adaptive_particle_filter.h | 214 + .../kld_adaptive_particle_filter_omp.h | 110 + .../nearest_pair_point_cloud_coherence.h | 97 + .../include/pcl/tracking/normal_coherence.h | 50 + .../include/pcl/tracking/particle_filter.h | 524 + .../pcl/tracking/particle_filter_omp.h | 106 + tracking/include/pcl/tracking/tracker.h | 135 + tracking/include/pcl/tracking/tracking.h | 130 + ...rox_nearest_pair_point_cloud_coherence.cpp | 8 + tracking/src/distance_coherence.cpp | 8 + tracking/src/hsv_color_coherence.cpp | 8 + tracking/src/kld_adaptive_particle_filter.cpp | 9 + .../src/kld_adaptive_particle_filter_omp.cpp | 10 + .../nearest_pair_point_cloud_coherence.cpp | 47 + tracking/src/normal_coherence.cpp | 8 + tracking/src/particle_filter.cpp | 10 + tracking/src/particle_filter_omp.cpp | 10 + tracking/src/tracking.cpp | 15 + visualization/CMakeLists.txt | 121 + .../include/pcl/visualization/cloud_viewer.h | 220 + .../pcl/visualization/common/actor_map.h | 102 + .../include/pcl/visualization/common/common.h | 152 + .../visualization/common/float_image_utils.h | 103 + .../pcl/visualization/common/impl/shapes.hpp | 104 + .../include/pcl/visualization/common/io.h | 72 + .../common/ren_win_interact_map.h | 90 + .../include/pcl/visualization/common/shapes.h | 266 + .../pcl/visualization/histogram_visualizer.h | 287 + .../include/pcl/visualization/image_viewer.h | 798 + .../impl/histogram_visualizer.hpp | 217 + .../pcl/visualization/impl/image_viewer.hpp | 497 + .../pcl/visualization/impl/pcl_visualizer.hpp | 1476 + .../impl/point_cloud_handlers.hpp | 547 + .../impl/registration_visualizer.hpp | 211 + .../include/pcl/visualization/interactor.h | 107 + .../pcl/visualization/interactor_style.h | 305 + .../pcl/visualization/keyboard_event.h | 182 + .../include/pcl/visualization/mouse_event.h | 197 + .../pcl/visualization/pcl_visualizer.h | 1781 + .../pcl/visualization/point_cloud_handlers.h | 963 + .../pcl/visualization/point_picking_event.h | 131 + .../visualization/range_image_visualizer.h | 117 + .../visualization/registration_visualizer.h | 215 + visualization/include/pcl/visualization/vtk.h | 150 + .../vtk/pcl_image_canvas_source_2d.h | 68 + .../include/pcl/visualization/window.h | 240 + visualization/src/cloud_viewer.cpp | 365 + visualization/src/common/common.cpp | 106 + .../src/common/float_image_utils.cpp | 289 + visualization/src/common/io.cpp | 149 + visualization/src/common/shapes.cpp | 265 + visualization/src/histogram_visualizer.cpp | 552 + visualization/src/image_viewer.cpp | 813 + visualization/src/interactor.cpp | 140 + visualization/src/interactor_style.cpp | 968 + visualization/src/pcl_visualizer.cpp | 3165 + visualization/src/point_cloud_handlers.cpp | 617 + visualization/src/point_picking_event.cpp | 117 + visualization/src/range_image_visualizer.cpp | 151 + .../src/vtk/pcl_image_canvas_source_2d.cpp | 49 + visualization/src/window.cpp | 322 + visualization/test/CMakeLists.txt | 11 + visualization/test/test.cpp | 93 + visualization/test/test_geometry.cpp | 89 + visualization/test/test_shapes.cpp | 42 + visualization/tools/CMakeLists.txt | 24 + visualization/tools/oni_viewer_simple.cpp | 206 + visualization/tools/openni_image.cpp | 316 + visualization/tools/openni_viewer.cpp | 244 + visualization/tools/openni_viewer_simple.cpp | 381 + visualization/tools/pcd_grabber_viewer.cpp | 274 + visualization/tools/pcd_viewer.cpp | 524 + visualization/tools/timed_trigger_test.cpp | 44 + visualization/visualization.doxy | 37 + 1377 files changed, 763067 insertions(+) create mode 100644 AUTHORS.txt create mode 100644 CMakeLists.txt create mode 100644 LICENSE.txt create mode 100644 PCLConfig.cmake.in create mode 100644 PCLConfigVersion.cmake.in create mode 100644 apps/CMakeLists.txt create mode 100644 apps/include/pcl/apps/dominant_plane_segmentation.h create mode 100644 apps/include/pcl/apps/impl/dominant_plane_segmentation.hpp create mode 100644 apps/include/pcl/apps/nn_classification.h create mode 100644 apps/include/pcl/apps/openni_passthrough.h create mode 100644 apps/include/pcl/apps/organized_segmentation_demo.h create mode 100644 apps/include/pcl/apps/render_views_tesselated_sphere.h create mode 100644 apps/include/pcl/apps/timer.h create mode 100644 apps/include/pcl/apps/vfh_nn_classifier.h create mode 100644 apps/src/convolve.cpp create mode 100644 apps/src/dominant_plane_segmentation.cpp create mode 100644 apps/src/feature_matching.cpp create mode 100644 apps/src/multiscale_feature_persistence_example.cpp create mode 100644 apps/src/ni_linemod.cpp create mode 100644 apps/src/nn_classification_example.cpp create mode 100644 apps/src/openni_3d_concave_hull.cpp create mode 100644 apps/src/openni_3d_convex_hull.cpp create mode 100644 apps/src/openni_boundary_estimation.cpp create mode 100644 apps/src/openni_change_viewer.cpp create mode 100644 apps/src/openni_color_filter.cpp create mode 100644 apps/src/openni_fast_mesh.cpp create mode 100644 apps/src/openni_feature_persistence.cpp create mode 100644 apps/src/openni_floodfill_planar_segmentation.cpp create mode 100644 apps/src/openni_grab_frame.cpp create mode 100644 apps/src/openni_ii_normal_estimation.cpp create mode 100644 apps/src/openni_mls_smoothing.cpp create mode 100644 apps/src/openni_mobile_server.cpp create mode 100644 apps/src/openni_organized_multi_plane_segmentation.cpp create mode 100644 apps/src/openni_passthrough.cpp create mode 100644 apps/src/openni_passthrough.ui create mode 100644 apps/src/openni_planar_convex_hull.cpp create mode 100644 apps/src/openni_planar_segmentation.cpp create mode 100644 apps/src/openni_stream_compression.cpp create mode 100644 apps/src/openni_tracking.cpp create mode 100644 apps/src/openni_uniform_sampling.cpp create mode 100644 apps/src/openni_voxel_grid.cpp create mode 100644 apps/src/organized_segmentation_demo.cpp create mode 100644 apps/src/organized_segmentation_demo.ui create mode 100644 apps/src/pcd_organized_multi_plane_segmentation.cpp create mode 100644 apps/src/ppf_object_recognition.cpp create mode 100644 apps/src/pyramid_surface_matching.cpp create mode 100644 apps/src/render_views_tesselated_sphere.cpp create mode 100644 apps/src/statistical_multiscale_interest_region_extraction_example.cpp create mode 100644 apps/src/surfel_smoothing_test.cpp create mode 100644 apps/src/test_search.cpp create mode 100644 cmake/CMakeParseArguments.cmake create mode 100644 cmake/CudaComputeTargetFlags.cmake create mode 100644 cmake/Modules/FindEigen.cmake create mode 100644 cmake/Modules/FindFLANN.cmake create mode 100644 cmake/Modules/FindGLEW.cmake create mode 100644 cmake/Modules/FindMPI.cmake create mode 100644 cmake/Modules/FindOpenNI.cmake create mode 100644 cmake/Modules/FindQVTK.cmake create mode 100644 cmake/Modules/FindQhull.cmake create mode 100644 cmake/Modules/FindSphinx.cmake create mode 100644 cmake/Modules/Findlibusb-1.0.cmake create mode 100644 cmake/Modules/NSIS.template.in create mode 100644 cmake/cpack_options.cmake.in create mode 100644 cmake/dep_graph.cmake create mode 100644 cmake/images/README create mode 100644 cmake/images/pcl.ico create mode 100644 cmake/images/pcl_horz_large_pos.bmp create mode 100644 cmake/images/pcl_vert_large_pos.png create mode 100644 cmake/images/pcl_vert_large_pos_no_text.bmp create mode 100644 cmake/merge_cmake_install.py create mode 100644 cmake/pcl_all_in_one_installer.cmake create mode 100644 cmake/pcl_cpack.cmake create mode 100644 cmake/pcl_find_boost.cmake create mode 100644 cmake/pcl_find_python.cmake create mode 100644 cmake/pcl_find_ros.cmake create mode 100644 cmake/pcl_find_sse.cmake create mode 100644 cmake/pcl_options.cmake create mode 100644 cmake/pcl_pclconfig.cmake create mode 100644 cmake/pcl_targets.cmake create mode 100644 cmake/pcl_tests.cmake create mode 100644 cmake/pcl_utils.cmake create mode 100644 cmake/pkgconfig.cmake.in create mode 100644 cmake/uninstall_target.cmake.in create mode 100644 common/CMakeLists.txt create mode 100644 common/common.doxy create mode 100644 common/include/pcl/ModelCoefficients.h create mode 100644 common/include/pcl/PointIndices.h create mode 100644 common/include/pcl/PolygonMesh.h create mode 100644 common/include/pcl/TextureMesh.h create mode 100644 common/include/pcl/Vertices.h create mode 100644 common/include/pcl/channel_properties.h create mode 100644 common/include/pcl/cloud_properties.h create mode 100644 common/include/pcl/common/angles.h create mode 100644 common/include/pcl/common/bivariate_polynomial.h create mode 100644 common/include/pcl/common/centroid.h create mode 100644 common/include/pcl/common/common.h create mode 100644 common/include/pcl/common/common_headers.h create mode 100644 common/include/pcl/common/concatenate.h create mode 100644 common/include/pcl/common/distances.h create mode 100644 common/include/pcl/common/eigen.h create mode 100644 common/include/pcl/common/file_io.h create mode 100644 common/include/pcl/common/gaussian.h create mode 100644 common/include/pcl/common/geometry.h create mode 100644 common/include/pcl/common/impl/angles.hpp create mode 100644 common/include/pcl/common/impl/bivariate_polynomial.hpp create mode 100644 common/include/pcl/common/impl/centroid.hpp create mode 100644 common/include/pcl/common/impl/common.hpp create mode 100644 common/include/pcl/common/impl/eigen.hpp create mode 100644 common/include/pcl/common/impl/file_io.hpp create mode 100644 common/include/pcl/common/impl/gaussian.hpp create mode 100644 common/include/pcl/common/impl/intensity.hpp create mode 100644 common/include/pcl/common/impl/io.hpp create mode 100644 common/include/pcl/common/impl/norms.hpp create mode 100644 common/include/pcl/common/impl/pca.hpp create mode 100644 common/include/pcl/common/impl/piecewise_linear_function.hpp create mode 100644 common/include/pcl/common/impl/polynomial_calculations.hpp create mode 100644 common/include/pcl/common/impl/spring.hpp create mode 100644 common/include/pcl/common/impl/transformation_from_correspondences.hpp create mode 100644 common/include/pcl/common/impl/transforms.hpp create mode 100644 common/include/pcl/common/impl/vector_average.hpp create mode 100644 common/include/pcl/common/intensity.h create mode 100644 common/include/pcl/common/intersections.h create mode 100644 common/include/pcl/common/io.h create mode 100644 common/include/pcl/common/norms.h create mode 100644 common/include/pcl/common/pca.h create mode 100644 common/include/pcl/common/piecewise_linear_function.h create mode 100644 common/include/pcl/common/point_operators.h create mode 100644 common/include/pcl/common/polynomial_calculations.h create mode 100644 common/include/pcl/common/poses_from_matches.h create mode 100644 common/include/pcl/common/spring.h create mode 100644 common/include/pcl/common/synchronizer.h create mode 100644 common/include/pcl/common/time.h create mode 100644 common/include/pcl/common/time_trigger.h create mode 100644 common/include/pcl/common/transformation_from_correspondences.h create mode 100644 common/include/pcl/common/transforms.h create mode 100644 common/include/pcl/common/utils.h create mode 100644 common/include/pcl/common/vector_average.h create mode 100644 common/include/pcl/console/parse.h create mode 100644 common/include/pcl/console/print.h create mode 100644 common/include/pcl/console/time.h create mode 100644 common/include/pcl/correspondence.h create mode 100644 common/include/pcl/exceptions.h create mode 100644 common/include/pcl/for_each_type.h create mode 100644 common/include/pcl/impl/instantiate.hpp create mode 100644 common/include/pcl/impl/point_types.hpp create mode 100644 common/include/pcl/pcl_base.h create mode 100644 common/include/pcl/pcl_exports.h create mode 100644 common/include/pcl/pcl_macros.h create mode 100644 common/include/pcl/pcl_tests.h create mode 100644 common/include/pcl/point_cloud.h create mode 100644 common/include/pcl/point_representation.h create mode 100644 common/include/pcl/point_traits.h create mode 100644 common/include/pcl/point_types.h create mode 100644 common/include/pcl/point_types_conversion.h create mode 100644 common/include/pcl/range_image/impl/range_image.hpp create mode 100644 common/include/pcl/range_image/impl/range_image_planar.hpp create mode 100644 common/include/pcl/range_image/range_image.h create mode 100644 common/include/pcl/range_image/range_image_planar.h create mode 100644 common/include/pcl/ros/conversions.h create mode 100644 common/include/pcl/ros/register_point_struct.h create mode 100644 common/include/sensor_msgs/Image.h create mode 100644 common/include/sensor_msgs/PointCloud2.h create mode 100644 common/include/sensor_msgs/PointField.h create mode 100644 common/include/std_msgs/Header.h create mode 100644 common/src/common.cpp create mode 100644 common/src/correspondence.cpp create mode 100644 common/src/distances.cpp create mode 100644 common/src/gaussian.cpp create mode 100644 common/src/intersections.cpp create mode 100644 common/src/io.cpp create mode 100644 common/src/parse.cpp create mode 100644 common/src/pcl_base.cpp create mode 100644 common/src/poses_from_matches.cpp create mode 100644 common/src/print.cpp create mode 100644 common/src/range_image.cpp create mode 100644 common/src/range_image_planar.cpp create mode 100644 common/src/time_trigger.cpp create mode 100644 common/test/CMakeLists.txt create mode 100644 common/test/test_common.cpp create mode 100644 common/test/test_eigen.cpp create mode 100644 common/test/test_gaussian.cpp create mode 100644 common/test/test_intensity.cpp create mode 100644 common/test/test_macros.cpp create mode 100644 common/test/test_operators.cpp create mode 100644 common/test/test_pca.cpp create mode 100644 common/test/test_plane_intersection.cpp create mode 100644 common/test/test_spring.cpp create mode 100644 common/test/test_vector_average.cpp create mode 100644 common/test/test_wrappers.cpp create mode 100644 doc/CMakeLists.txt create mode 100644 doc/advanced/Makefile create mode 100644 doc/advanced/content/_templates/layout.html create mode 100644 doc/advanced/content/branches_repository.rst create mode 100644 doc/advanced/content/c_cache.rst create mode 100644 doc/advanced/content/compiler_optimizations.rst create mode 100644 doc/advanced/content/conf.py create mode 100644 doc/advanced/content/distcc.rst create mode 100644 doc/advanced/content/exceptions_guide.rst create mode 100644 doc/advanced/content/how_to_write_a_tutorial.rst create mode 100644 doc/advanced/content/images/ccache.png create mode 100644 doc/advanced/content/images/distcc.png create mode 100644 doc/advanced/content/images/distcc_plot.png create mode 100644 doc/advanced/content/images/optimize.png create mode 100644 doc/advanced/content/images/unitybuild.jpg create mode 100644 doc/advanced/content/index.rst create mode 100644 doc/advanced/content/minimal_example.rst create mode 100644 doc/advanced/content/pcl_style_guide.rst create mode 100644 doc/advanced/content/single_compile_unit.rst create mode 100644 doc/doxygen/CMakeLists.txt create mode 100644 doc/doxygen/doxyfile.in create mode 100644 doc/doxygen/doxygen_layout.xml create mode 100644 doc/doxygen/pcl.doxy create mode 100644 doc/overview/Makefile create mode 100644 doc/overview/content/_templates/layout.html create mode 100644 doc/overview/content/conf.py create mode 100644 doc/overview/content/images/visualization/bunny.jpg create mode 100644 doc/overview/content/images/visualization/ex1.jpg create mode 100644 doc/overview/content/images/visualization/ex2.jpg create mode 100644 doc/overview/content/images/visualization/ex3.jpg create mode 100644 doc/overview/content/images/visualization/ex4.jpg create mode 100644 doc/overview/content/images/visualization/ex5.jpg create mode 100644 doc/overview/content/images/visualization/histogram.jpg create mode 100644 doc/overview/content/images/visualization/normals.jpg create mode 100644 doc/overview/content/images/visualization/pcs.jpg create mode 100644 doc/overview/content/images/visualization/range_image.jpg create mode 100644 doc/overview/content/images/visualization/shapes.jpg create mode 100644 doc/overview/content/index.rst create mode 100644 doc/overview/content/visualization.rst create mode 100644 doc/tutorials/CMakeLists.txt create mode 100644 doc/tutorials/Makefile create mode 100644 doc/tutorials/content/_templates/layout.html create mode 100644 doc/tutorials/content/adding_custom_ptype.rst create mode 100644 doc/tutorials/content/basic_structures.rst create mode 100644 doc/tutorials/content/benchmark.rst create mode 100644 doc/tutorials/content/benchmark_filters.rst create mode 100644 doc/tutorials/content/building_pcl.rst create mode 100644 doc/tutorials/content/cloud_viewer.rst create mode 100644 doc/tutorials/content/cluster_extraction.rst create mode 100644 doc/tutorials/content/compiling_pcl_dependencies_windows.rst create mode 100644 doc/tutorials/content/compiling_pcl_macosx.rst create mode 100644 doc/tutorials/content/compiling_pcl_windows.rst create mode 100644 doc/tutorials/content/compression.rst create mode 100644 doc/tutorials/content/concatenate_clouds.rst create mode 100644 doc/tutorials/content/concatenate_fields.rst create mode 100644 doc/tutorials/content/concatenate_points.rst create mode 100644 doc/tutorials/content/conditional_removal.rst create mode 100644 doc/tutorials/content/conf.py create mode 100644 doc/tutorials/content/convex_hull_2d.rst create mode 100644 doc/tutorials/content/cvfh_signature.rst create mode 100644 doc/tutorials/content/cylinder_segmentation.rst create mode 100644 doc/tutorials/content/extract_indices.rst create mode 100644 doc/tutorials/content/feature_evaluation_framework.rst create mode 100644 doc/tutorials/content/fpfh_estimation.rst create mode 100644 doc/tutorials/content/greedy_projection.rst create mode 100644 doc/tutorials/content/how_features_work.rst create mode 100644 doc/tutorials/content/hull_2d.rst create mode 100644 doc/tutorials/content/images/2d_kdtree.png create mode 100644 doc/tutorials/content/images/3dtree.png create mode 100644 doc/tutorials/content/images/PCD_icon.png create mode 100644 doc/tutorials/content/images/SVNCheckout.png create mode 100644 doc/tutorials/content/images/bunny.jpg create mode 100644 doc/tutorials/content/images/changedetectionThumb.png create mode 100644 doc/tutorials/content/images/changedetectionViewer.png create mode 100644 doc/tutorials/content/images/cloud_viewer.jpg create mode 100644 doc/tutorials/content/images/cluster_extraction.jpg create mode 100644 doc/tutorials/content/images/cmake_cminpack_1.png create mode 100644 doc/tutorials/content/images/cmake_cminpack_2.png create mode 100644 doc/tutorials/content/images/cmake_cminpack_3.png create mode 100644 doc/tutorials/content/images/compression_tutorial.png create mode 100644 doc/tutorials/content/images/concatenate_data.jpg create mode 100644 doc/tutorials/content/images/concatenate_fields.jpg create mode 100644 doc/tutorials/content/images/concave_hull_2d.gif create mode 100644 doc/tutorials/content/images/convex_hull_2d.jpg create mode 100644 doc/tutorials/content/images/cvfh_histogram.png create mode 100644 doc/tutorials/content/images/cylinder_model_seg.png create mode 100644 doc/tutorials/content/images/cylinder_segmentation.jpg create mode 100644 doc/tutorials/content/images/ex1.jpg create mode 100644 doc/tutorials/content/images/extract_indices.jpg create mode 100644 doc/tutorials/content/images/feature_evaluation/class_hierarchy.png create mode 100644 doc/tutorials/content/images/features_bunny.png create mode 100644 doc/tutorials/content/images/features_input_explained.png create mode 100644 doc/tutorials/content/images/features_normal.png create mode 100644 doc/tutorials/content/images/features_small.png create mode 100644 doc/tutorials/content/images/filters_small.png create mode 100644 doc/tutorials/content/images/form_0.png create mode 100644 doc/tutorials/content/images/form_1.png create mode 100644 doc/tutorials/content/images/fpfh_estimation.jpg create mode 100644 doc/tutorials/content/images/fpfh_estimation/fpfh_diagram.png create mode 100644 doc/tutorials/content/images/fpfh_estimation/fpfh_theory.jpg create mode 100644 doc/tutorials/content/images/good_features.png create mode 100644 doc/tutorials/content/images/good_features_small.png create mode 100644 doc/tutorials/content/images/greedy_triangulation.png create mode 100644 doc/tutorials/content/images/histogram.jpg create mode 100644 doc/tutorials/content/images/io_small.jpg create mode 100644 doc/tutorials/content/images/iterative_closest_point.gif create mode 100644 doc/tutorials/content/images/kdtree_mug.png create mode 100644 doc/tutorials/content/images/kdtree_search.png create mode 100644 doc/tutorials/content/images/kdtree_small.png create mode 100644 doc/tutorials/content/images/keypoints_small.png create mode 100644 doc/tutorials/content/images/macosx_logo.png create mode 100644 doc/tutorials/content/images/msvc_build_build_all.jpg create mode 100644 doc/tutorials/content/images/msvc_build_install.jpg create mode 100644 doc/tutorials/content/images/narf_descriptor.jpg create mode 100644 doc/tutorials/content/images/narf_descriptor_visualization.png create mode 100644 doc/tutorials/content/images/narf_keypoint_extraction.png create mode 100644 doc/tutorials/content/images/nn_kdtree.gif create mode 100644 doc/tutorials/content/images/normal_estimation.png create mode 100644 doc/tutorials/content/images/normal_estimation/curvature_different_radii.png create mode 100644 doc/tutorials/content/images/normal_estimation/flipped_scene1.png create mode 100644 doc/tutorials/content/images/normal_estimation/flipped_scene2.png create mode 100644 doc/tutorials/content/images/normal_estimation/flipped_sphere.png create mode 100644 doc/tutorials/content/images/normal_estimation/normals_different_radii.png create mode 100644 doc/tutorials/content/images/normal_estimation/unflipped_scene1.png create mode 100644 doc/tutorials/content/images/normal_estimation/unflipped_scene2.png create mode 100644 doc/tutorials/content/images/normal_estimation/unflipped_sphere.png create mode 100644 doc/tutorials/content/images/normal_estimation_ii.png create mode 100644 doc/tutorials/content/images/normals.jpg create mode 100644 doc/tutorials/content/images/octree_bunny.png create mode 100644 doc/tutorials/content/images/octree_bunny2.png create mode 100644 doc/tutorials/content/images/octree_img.png create mode 100644 doc/tutorials/content/images/octree_small.png create mode 100644 doc/tutorials/content/images/openni_cams.png create mode 100644 doc/tutorials/content/images/openni_grabber.png create mode 100644 doc/tutorials/content/images/pair_inc.png create mode 100644 doc/tutorials/content/images/passthrough.png create mode 100644 doc/tutorials/content/images/passthrough_2.png create mode 100644 doc/tutorials/content/images/pcl_ccmake.png create mode 100644 doc/tutorials/content/images/pcl_logo.png create mode 100644 doc/tutorials/content/images/pcl_openni_viewer.jpg create mode 100644 doc/tutorials/content/images/pcl_visualizer_color_custom.png create mode 100644 doc/tutorials/content/images/pcl_visualizer_color_rgb.png create mode 100644 doc/tutorials/content/images/pcl_visualizer_interaction_customization.png create mode 100644 doc/tutorials/content/images/pcl_visualizer_normals.png create mode 100644 doc/tutorials/content/images/pcl_visualizer_shapes.png create mode 100644 doc/tutorials/content/images/pcl_visualizer_simple.png create mode 100644 doc/tutorials/content/images/pcl_visualizer_viewports.png create mode 100644 doc/tutorials/content/images/pcs.jpg create mode 100644 doc/tutorials/content/images/pfh_estimation.png create mode 100644 doc/tutorials/content/images/pfh_estimation/example_pfhs.png create mode 100644 doc/tutorials/content/images/pfh_estimation/pfh_diagram.png create mode 100644 doc/tutorials/content/images/pfh_estimation/pfh_frame.png create mode 100644 doc/tutorials/content/images/planar_segmentation.jpg create mode 100644 doc/tutorials/content/images/planar_segmentation_2.png create mode 100644 doc/tutorials/content/images/plane_model_seg.png create mode 100644 doc/tutorials/content/images/project_inliers.png create mode 100644 doc/tutorials/content/images/project_inliers_2.png create mode 100644 doc/tutorials/content/images/radius_outlier.png create mode 100644 doc/tutorials/content/images/random_sample_example1.png create mode 100644 doc/tutorials/content/images/random_sample_example2.png create mode 100644 doc/tutorials/content/images/range_image.jpg create mode 100644 doc/tutorials/content/images/range_image_border_points.png create mode 100644 doc/tutorials/content/images/range_image_small.png create mode 100644 doc/tutorials/content/images/range_image_visualization.png create mode 100644 doc/tutorials/content/images/ransac_inliers_plane.png create mode 100644 doc/tutorials/content/images/ransac_inliers_sphere.png create mode 100644 doc/tutorials/content/images/ransac_outliers_plane.png create mode 100644 doc/tutorials/content/images/ransac_outliers_sphere.png create mode 100644 doc/tutorials/content/images/read_pcd.jpg create mode 100644 doc/tutorials/content/images/registration/block_diagram_single_iteration.png create mode 100644 doc/tutorials/content/images/registration/registration_api.png create mode 100644 doc/tutorials/content/images/registration/s1-6.png create mode 100644 doc/tutorials/content/images/registration/scans.png create mode 100644 doc/tutorials/content/images/registration_small.png create mode 100644 doc/tutorials/content/images/resampling.jpg create mode 100644 doc/tutorials/content/images/resampling_1.png create mode 100644 doc/tutorials/content/images/resampling_2.png create mode 100644 doc/tutorials/content/images/s1-6.png create mode 100644 doc/tutorials/content/images/sample_consensus_planes_cylinders.png create mode 100644 doc/tutorials/content/images/sample_consensus_small.png create mode 100644 doc/tutorials/content/images/scans.png create mode 100644 doc/tutorials/content/images/segmentation_small.png create mode 100644 doc/tutorials/content/images/shapes.jpg create mode 100644 doc/tutorials/content/images/statistical_removal.jpg create mode 100644 doc/tutorials/content/images/statistical_removal_2.png create mode 100644 doc/tutorials/content/images/surface_hull.png create mode 100644 doc/tutorials/content/images/surface_meshing.png create mode 100644 doc/tutorials/content/images/surface_small.png create mode 100644 doc/tutorials/content/images/template_alignment_1.png create mode 100644 doc/tutorials/content/images/template_alignment_2.png create mode 100644 doc/tutorials/content/images/template_alignment_3.png create mode 100644 doc/tutorials/content/images/template_alignment_4.png create mode 100644 doc/tutorials/content/images/vfh_estimation.png create mode 100644 doc/tutorials/content/images/vfh_estimation/first_component.png create mode 100644 doc/tutorials/content/images/vfh_estimation/second_component.png create mode 100644 doc/tutorials/content/images/vfh_estimation/vfh_example.png create mode 100644 doc/tutorials/content/images/vfh_estimation/vfh_histogram.png create mode 100644 doc/tutorials/content/images/vfh_estimation/vfh_histogram_visualized.png create mode 100644 doc/tutorials/content/images/vfh_recognition.jpg create mode 100644 doc/tutorials/content/images/vfh_recognition/objects.jpg create mode 100644 doc/tutorials/content/images/vfh_recognition/pan_tilt.jpg create mode 100644 doc/tutorials/content/images/vfh_recognition/scene_raw.png create mode 100644 doc/tutorials/content/images/vfh_recognition/scene_segmented.png create mode 100644 doc/tutorials/content/images/vfh_recognition/training.png create mode 100644 doc/tutorials/content/images/vfh_recognition/vfh_example1.jpg create mode 100644 doc/tutorials/content/images/vfh_recognition/vfh_example2.jpg create mode 100644 doc/tutorials/content/images/vfh_recognition/vfh_example3.jpg create mode 100644 doc/tutorials/content/images/visualization_small.png create mode 100644 doc/tutorials/content/images/voxel_grid.jpg create mode 100644 doc/tutorials/content/images/windows/SVNCheckout_pcl_trunk.png create mode 100644 doc/tutorials/content/images/windows/cmake_boost.png create mode 100644 doc/tutorials/content/images/windows/cmake_boost_found.png create mode 100644 doc/tutorials/content/images/windows/cmake_configure_error.png create mode 100644 doc/tutorials/content/images/windows/cmake_configure_noerror.png create mode 100644 doc/tutorials/content/images/windows/cmake_eigen_include_dir.png create mode 100644 doc/tutorials/content/images/windows/cmake_flann.png create mode 100644 doc/tutorials/content/images/windows/cmake_generator.png create mode 100644 doc/tutorials/content/images/windows/cmake_grouped_advanced.png create mode 100644 doc/tutorials/content/images/windows/cmake_openni.png create mode 100644 doc/tutorials/content/images/windows/cmake_pcl.png create mode 100644 doc/tutorials/content/images/windows/cmake_qhull.png create mode 100644 doc/tutorials/content/images/windows/cmake_vtk_configure.png create mode 100644 doc/tutorials/content/images/windows/cmake_vtk_found_enable_visualization.png create mode 100644 doc/tutorials/content/images/windows/msvc_build_build_all.jpg create mode 100644 doc/tutorials/content/images/windows/msvc_build_install.jpg create mode 100644 doc/tutorials/content/images/windows/pcl_solution_with_projects_folder.png create mode 100644 doc/tutorials/content/images/windows/pcl_solution_without_projects_folder.png create mode 100644 doc/tutorials/content/images/windows_logo.png create mode 100644 doc/tutorials/content/images/write_pcd.jpg create mode 100644 doc/tutorials/content/index.rst create mode 100644 doc/tutorials/content/installing_homebrew.rst create mode 100644 doc/tutorials/content/iterative_closest_point.rst create mode 100644 doc/tutorials/content/kdtree_search.rst create mode 100644 doc/tutorials/content/narf_descriptor_visualization.rst create mode 100644 doc/tutorials/content/narf_feature_extraction.rst create mode 100644 doc/tutorials/content/narf_keypoint_extraction.rst create mode 100644 doc/tutorials/content/normal_estimation.rst create mode 100644 doc/tutorials/content/normal_estimation_using_integral_images.rst create mode 100644 doc/tutorials/content/octree.rst create mode 100644 doc/tutorials/content/octree_change.rst create mode 100644 doc/tutorials/content/openni_grabber.rst create mode 100644 doc/tutorials/content/passthrough.rst create mode 100644 doc/tutorials/content/pcd_file_format.rst create mode 100644 doc/tutorials/content/pcl_visualizer.rst create mode 100644 doc/tutorials/content/pfh_estimation.rst create mode 100644 doc/tutorials/content/planar_segmentation.rst create mode 100644 doc/tutorials/content/project_inliers.rst create mode 100644 doc/tutorials/content/radius_outlier_removal.rst create mode 100644 doc/tutorials/content/random_sample_consensus.rst create mode 100644 doc/tutorials/content/range_image_border_extraction.rst create mode 100644 doc/tutorials/content/range_image_creation.rst create mode 100644 doc/tutorials/content/range_image_visualization.rst create mode 100644 doc/tutorials/content/reading_pcd.rst create mode 100644 doc/tutorials/content/registration_api.rst create mode 100644 doc/tutorials/content/remove_outliers.rst create mode 100644 doc/tutorials/content/resampling.rst create mode 100644 doc/tutorials/content/sources/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/cloud_viewer/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/cloud_viewer/cloud_viewer.cpp create mode 100644 doc/tutorials/content/sources/cluster_extraction/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/cluster_extraction/cluster_extraction.cpp create mode 100644 doc/tutorials/content/sources/concatenate_clouds/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/concatenate_clouds/concatenate_clouds.cpp create mode 100644 doc/tutorials/content/sources/concatenate_fields/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/concatenate_fields/concatenate_fields.cpp create mode 100644 doc/tutorials/content/sources/concatenate_points/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/concatenate_points/concatenate_points.cpp create mode 100644 doc/tutorials/content/sources/concave_hull_2d/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/concave_hull_2d/concave_hull_2d.cpp create mode 100644 doc/tutorials/content/sources/conditional_removal/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/conditional_removal/conditional_removal.cpp create mode 100644 doc/tutorials/content/sources/convex_hull_2d/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/convex_hull_2d/convex_hull_2d.cpp create mode 100644 doc/tutorials/content/sources/cylinder_segmentation/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/cylinder_segmentation/cylinder_segmentation.cpp create mode 100644 doc/tutorials/content/sources/extract_indices/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/extract_indices/extract_indices.cpp create mode 100644 doc/tutorials/content/sources/greedy_projection/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/greedy_projection/greedy_projection.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/iccv2011/include/feature_estimation.h create mode 100644 doc/tutorials/content/sources/iccv2011/include/filters.h create mode 100644 doc/tutorials/content/sources/iccv2011/include/load_clouds.h create mode 100644 doc/tutorials/content/sources/iccv2011/include/object_recognition.h create mode 100644 doc/tutorials/content/sources/iccv2011/include/openni_capture.h create mode 100644 doc/tutorials/content/sources/iccv2011/include/registration.h create mode 100644 doc/tutorials/content/sources/iccv2011/include/segmentation.h create mode 100644 doc/tutorials/content/sources/iccv2011/include/surface.h create mode 100644 doc/tutorials/content/sources/iccv2011/include/typedefs.h create mode 100644 doc/tutorials/content/sources/iccv2011/src/build_all_object_models.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/src/build_object_model.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/src/capture_tool.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/src/correspondence_viewer.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/src/openni_capture.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/src/test_feature_estimation.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/src/test_filters.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/src/test_object_recognition.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/src/test_registration.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/src/test_segmentation.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/src/test_surface.cpp create mode 100644 doc/tutorials/content/sources/iccv2011/src/tutorial.cpp create mode 100644 doc/tutorials/content/sources/iros2011/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/iros2011/include/feature_estimation.h create mode 100644 doc/tutorials/content/sources/iros2011/include/filters.h create mode 100644 doc/tutorials/content/sources/iros2011/include/load_clouds.h create mode 100644 doc/tutorials/content/sources/iros2011/include/object_recognition.h create mode 100644 doc/tutorials/content/sources/iros2011/include/openni_capture.h create mode 100644 doc/tutorials/content/sources/iros2011/include/registration.h create mode 100644 doc/tutorials/content/sources/iros2011/include/segmentation.h create mode 100644 doc/tutorials/content/sources/iros2011/include/solution/feature_estimation.h create mode 100644 doc/tutorials/content/sources/iros2011/include/solution/filters.h create mode 100644 doc/tutorials/content/sources/iros2011/include/solution/object_recognition.h create mode 100644 doc/tutorials/content/sources/iros2011/include/solution/openni_capture.h create mode 100644 doc/tutorials/content/sources/iros2011/include/solution/registration.h create mode 100644 doc/tutorials/content/sources/iros2011/include/solution/segmentation.h create mode 100644 doc/tutorials/content/sources/iros2011/include/solution/surface.h create mode 100644 doc/tutorials/content/sources/iros2011/include/solution/typedefs.h create mode 100644 doc/tutorials/content/sources/iros2011/include/surface.h create mode 100644 doc/tutorials/content/sources/iros2011/include/typedefs.h create mode 100644 doc/tutorials/content/sources/iros2011/src/build_all_object_models.cpp create mode 100644 doc/tutorials/content/sources/iros2011/src/build_object_model.cpp create mode 100644 doc/tutorials/content/sources/iros2011/src/capture_tool.cpp create mode 100644 doc/tutorials/content/sources/iros2011/src/correspondence_viewer.cpp create mode 100644 doc/tutorials/content/sources/iros2011/src/openni_capture.cpp create mode 100644 doc/tutorials/content/sources/iros2011/src/test_feature_estimation.cpp create mode 100644 doc/tutorials/content/sources/iros2011/src/test_filters.cpp create mode 100644 doc/tutorials/content/sources/iros2011/src/test_object_recognition.cpp create mode 100644 doc/tutorials/content/sources/iros2011/src/test_registration.cpp create mode 100644 doc/tutorials/content/sources/iros2011/src/test_segmentation.cpp create mode 100644 doc/tutorials/content/sources/iros2011/src/test_surface.cpp create mode 100644 doc/tutorials/content/sources/iterative_closest_point/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/iterative_closest_point/iterative_closest_point.cpp create mode 100644 doc/tutorials/content/sources/kdtree_search/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/kdtree_search/kdtree_search.cpp create mode 100644 doc/tutorials/content/sources/narf_descriptor_visualization/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/narf_descriptor_visualization/narf_descriptor_visualization.cpp create mode 100644 doc/tutorials/content/sources/narf_feature_extraction/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/narf_feature_extraction/narf_feature_extraction.cpp create mode 100644 doc/tutorials/content/sources/narf_keypoint_extraction/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/narf_keypoint_extraction/narf_keypoint_extraction.cpp create mode 100644 doc/tutorials/content/sources/normal_estimation_using_integral_images/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/normal_estimation_using_integral_images/normal_estimation_using_integral_images.cpp create mode 100644 doc/tutorials/content/sources/octree_change_detection/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/octree_change_detection/octree_change_detection.cpp create mode 100644 doc/tutorials/content/sources/octree_search/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/octree_search/octree_search.cpp create mode 100644 doc/tutorials/content/sources/openni_grabber/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/openni_grabber/openni_grabber.cpp create mode 100644 doc/tutorials/content/sources/openni_narf_keypoint_extraction/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/openni_narf_keypoint_extraction/openni_narf_keypoint_extraction.cpp create mode 100644 doc/tutorials/content/sources/openni_range_image_visualization/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/openni_range_image_visualization/openni_range_image_visualization.cpp create mode 100644 doc/tutorials/content/sources/passthrough/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/passthrough/passthrough.cpp create mode 100644 doc/tutorials/content/sources/pcd_read/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/pcd_read/pcd_read.cpp create mode 100644 doc/tutorials/content/sources/pcd_write/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/pcd_write/pcd_write.cpp create mode 100644 doc/tutorials/content/sources/pcl_visualizer/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/pcl_visualizer/CMakeLists.txt.simple create mode 100644 doc/tutorials/content/sources/pcl_visualizer/pcl_visualizer_demo.cpp create mode 100644 doc/tutorials/content/sources/pcl_visualizer/pcl_visualizer_simple.cpp create mode 100644 doc/tutorials/content/sources/planar_segmentation/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/planar_segmentation/planar_segmentation.cpp create mode 100644 doc/tutorials/content/sources/point_cloud_compression/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/point_cloud_compression/point_cloud_compression.cpp create mode 100644 doc/tutorials/content/sources/project_inliers/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/project_inliers/project_inliers.cpp create mode 100644 doc/tutorials/content/sources/radius_outlier_removal/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/radius_outlier_removal/radius_outlier_removal.cpp create mode 100644 doc/tutorials/content/sources/random_sample_consensus/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/random_sample_consensus/random_sample_consensus.cpp create mode 100644 doc/tutorials/content/sources/range_image_border_extraction/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/range_image_border_extraction/range_image_border_extraction.cpp create mode 100644 doc/tutorials/content/sources/range_image_creation/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/range_image_creation/range_image_creation.cpp create mode 100644 doc/tutorials/content/sources/range_image_visualization/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/range_image_visualization/range_image_visualization.cpp create mode 100644 doc/tutorials/content/sources/remove_outliers/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/remove_outliers/remove_outliers.cpp create mode 100644 doc/tutorials/content/sources/resampling/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/resampling/resampling.cpp create mode 100644 doc/tutorials/content/sources/sac_model_registration/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/sac_model_registration/sac_model_registration.cpp create mode 100644 doc/tutorials/content/sources/statistical_removal/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/statistical_removal/statistical_removal.cpp create mode 100644 doc/tutorials/content/sources/stick_segmentation/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/stick_segmentation/stick_segmentation.cpp create mode 100644 doc/tutorials/content/sources/template_alignment/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/template_alignment/template_alignment.cpp create mode 100644 doc/tutorials/content/sources/vfh_recognition/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/vfh_recognition/FindFlann.cmake create mode 100644 doc/tutorials/content/sources/vfh_recognition/build_tree.cpp create mode 100644 doc/tutorials/content/sources/vfh_recognition/nearest_neighbors.cpp create mode 100644 doc/tutorials/content/sources/voxel_grid/CMakeLists.txt create mode 100644 doc/tutorials/content/sources/voxel_grid/voxel_grid.cpp create mode 100644 doc/tutorials/content/statistical_outlier.rst create mode 100644 doc/tutorials/content/template_alignment.rst create mode 100644 doc/tutorials/content/using_pcl_pcl_config.rst create mode 100644 doc/tutorials/content/vfh_estimation.rst create mode 100644 doc/tutorials/content/vfh_recognition.rst create mode 100644 doc/tutorials/content/voxel_grid.rst create mode 100644 doc/tutorials/content/writing_new_classes.rst create mode 100644 doc/tutorials/content/writing_pcd.rst create mode 100644 examples/CMakeLists.txt create mode 100644 examples/common/CMakeLists.txt create mode 100644 examples/common/example_check_if_point_is_valid.cpp create mode 100644 examples/common/example_copy_point_cloud.cpp create mode 100644 examples/common/example_get_max_min_coordinates.cpp create mode 100644 examples/common/example_organized_point_cloud.cpp create mode 100644 examples/common/example_scope_time.cpp create mode 100644 examples/features/CMakeLists.txt create mode 100644 examples/features/example_fast_point_feature_histograms.cpp create mode 100644 examples/features/example_normal_estimation.cpp create mode 100644 examples/features/example_point_feature_histograms.cpp create mode 100644 examples/features/example_principal_curvatures_estimation.cpp create mode 100644 examples/features/example_rift_estimation.cpp create mode 100644 examples/features/example_shape_contexts.cpp create mode 100644 examples/features/example_spin_images.cpp create mode 100644 examples/filters/CMakeLists.txt create mode 100644 examples/filters/example_extract_indices.cpp create mode 100644 examples/filters/example_remove_nan_from_point_cloud.cpp create mode 100644 examples/keypoints/CMakeLists.txt create mode 100644 examples/keypoints/example_sift_keypoint_estimation.cpp create mode 100644 examples/keypoints/example_sift_normal_keypoint_estimation.cpp create mode 100644 examples/keypoints/example_sift_z_keypoint_estimation.cpp create mode 100644 examples/segmentation/CMakeLists.txt create mode 100644 examples/segmentation/example_extract_clusters_normals.cpp create mode 100644 features/CMakeLists.txt create mode 100644 features/features.doxy create mode 100644 features/include/pcl/features/3dsc.h create mode 100644 features/include/pcl/features/boundary.h create mode 100644 features/include/pcl/features/cvfh.h create mode 100644 features/include/pcl/features/esf.h create mode 100644 features/include/pcl/features/feature.h create mode 100644 features/include/pcl/features/fpfh.h create mode 100644 features/include/pcl/features/fpfh_omp.h create mode 100644 features/include/pcl/features/impl/3dsc.hpp create mode 100644 features/include/pcl/features/impl/boundary.hpp create mode 100644 features/include/pcl/features/impl/cvfh.hpp create mode 100644 features/include/pcl/features/impl/esf.hpp create mode 100644 features/include/pcl/features/impl/feature.hpp create mode 100644 features/include/pcl/features/impl/fpfh.hpp create mode 100644 features/include/pcl/features/impl/fpfh_omp.hpp create mode 100644 features/include/pcl/features/impl/integral_image2D.hpp create mode 100644 features/include/pcl/features/impl/integral_image_normal.hpp create mode 100644 features/include/pcl/features/impl/intensity_gradient.hpp create mode 100644 features/include/pcl/features/impl/intensity_spin.hpp create mode 100644 features/include/pcl/features/impl/moment_invariants.hpp create mode 100644 features/include/pcl/features/impl/multiscale_feature_persistence.hpp create mode 100644 features/include/pcl/features/impl/narf.hpp create mode 100644 features/include/pcl/features/impl/normal_3d.hpp create mode 100644 features/include/pcl/features/impl/normal_3d_omp.hpp create mode 100644 features/include/pcl/features/impl/normal_based_signature.hpp create mode 100644 features/include/pcl/features/impl/pfh.hpp create mode 100644 features/include/pcl/features/impl/pfhrgb.hpp create mode 100644 features/include/pcl/features/impl/ppf.hpp create mode 100644 features/include/pcl/features/impl/ppfrgb.hpp create mode 100644 features/include/pcl/features/impl/principal_curvatures.hpp create mode 100644 features/include/pcl/features/impl/range_image_border_extractor.hpp create mode 100644 features/include/pcl/features/impl/rift.hpp create mode 100644 features/include/pcl/features/impl/rsd.hpp create mode 100644 features/include/pcl/features/impl/shot.hpp create mode 100644 features/include/pcl/features/impl/shot_lrf.hpp create mode 100644 features/include/pcl/features/impl/shot_lrf_omp.hpp create mode 100644 features/include/pcl/features/impl/shot_omp.hpp create mode 100644 features/include/pcl/features/impl/spin_image.hpp create mode 100644 features/include/pcl/features/impl/statistical_multiscale_interest_region_extraction.hpp create mode 100644 features/include/pcl/features/impl/usc.hpp create mode 100644 features/include/pcl/features/impl/vfh.hpp create mode 100644 features/include/pcl/features/integral_image2D.h create mode 100644 features/include/pcl/features/integral_image_normal.h create mode 100644 features/include/pcl/features/intensity_gradient.h create mode 100644 features/include/pcl/features/intensity_spin.h create mode 100644 features/include/pcl/features/moment_invariants.h create mode 100644 features/include/pcl/features/multiscale_feature_persistence.h create mode 100644 features/include/pcl/features/narf.h create mode 100644 features/include/pcl/features/narf_descriptor.h create mode 100644 features/include/pcl/features/normal_3d.h create mode 100644 features/include/pcl/features/normal_3d_omp.h create mode 100644 features/include/pcl/features/normal_based_signature.h create mode 100644 features/include/pcl/features/pfh.h create mode 100644 features/include/pcl/features/pfhrgb.h create mode 100644 features/include/pcl/features/ppf.h create mode 100644 features/include/pcl/features/ppfrgb.h create mode 100644 features/include/pcl/features/principal_curvatures.h create mode 100644 features/include/pcl/features/range_image_border_extractor.h create mode 100644 features/include/pcl/features/rift.h create mode 100644 features/include/pcl/features/rsd.h create mode 100644 features/include/pcl/features/shot.h create mode 100644 features/include/pcl/features/shot_lrf.h create mode 100644 features/include/pcl/features/shot_lrf_omp.h create mode 100644 features/include/pcl/features/shot_omp.h create mode 100644 features/include/pcl/features/spin_image.h create mode 100644 features/include/pcl/features/statistical_multiscale_interest_region_extraction.h create mode 100644 features/include/pcl/features/usc.h create mode 100644 features/include/pcl/features/vfh.h create mode 100644 features/src/3dsc.cpp create mode 100644 features/src/boundary.cpp create mode 100644 features/src/cvfh.cpp create mode 100644 features/src/esf.cpp create mode 100644 features/src/fpfh.cpp create mode 100644 features/src/fpfh_omp.cpp create mode 100644 features/src/integral_image_normal.cpp create mode 100644 features/src/intensity_gradient.cpp create mode 100644 features/src/intensity_spin.cpp create mode 100644 features/src/moment_invariants.cpp create mode 100644 features/src/multiscale_feature_persistence.cpp create mode 100644 features/src/narf.cpp create mode 100644 features/src/narf_descriptor.cpp create mode 100644 features/src/normal_3d.cpp create mode 100644 features/src/normal_3d_omp.cpp create mode 100644 features/src/normal_based_signature.cpp create mode 100644 features/src/pfh.cpp create mode 100644 features/src/pfhrgb.cpp create mode 100644 features/src/ppf.cpp create mode 100644 features/src/ppfrgb.cpp create mode 100644 features/src/principal_curvatures.cpp create mode 100644 features/src/range_image_border_extractor.cpp create mode 100644 features/src/rift.cpp create mode 100644 features/src/rsd.cpp create mode 100644 features/src/shot.cpp create mode 100644 features/src/shot_lrf.cpp create mode 100644 features/src/shot_lrf_omp.cpp create mode 100644 features/src/shot_omp.cpp create mode 100644 features/src/spin_image.cpp create mode 100644 features/src/statistical_multiscale_interest_region_extraction.cpp create mode 100644 features/src/usc.cpp create mode 100644 features/src/vfh.cpp create mode 100644 features/test/CMakeLists.txt create mode 100644 features/test/test_narf.cpp create mode 100644 filters/CMakeLists.txt create mode 100644 filters/filters.doxy create mode 100644 filters/include/pcl/filters/approximate_voxel_grid.h create mode 100644 filters/include/pcl/filters/bilateral.h create mode 100644 filters/include/pcl/filters/clipper3D.h create mode 100644 filters/include/pcl/filters/conditional_removal.h create mode 100644 filters/include/pcl/filters/crop_box.h create mode 100644 filters/include/pcl/filters/crop_hull.h create mode 100644 filters/include/pcl/filters/extract_indices.h create mode 100644 filters/include/pcl/filters/filter.h create mode 100644 filters/include/pcl/filters/filter_indices.h create mode 100644 filters/include/pcl/filters/impl/approximate_voxel_grid.hpp create mode 100644 filters/include/pcl/filters/impl/bilateral.hpp create mode 100644 filters/include/pcl/filters/impl/conditional_removal.hpp create mode 100644 filters/include/pcl/filters/impl/crop_box.hpp create mode 100644 filters/include/pcl/filters/impl/crop_hull.hpp create mode 100644 filters/include/pcl/filters/impl/extract_indices.hpp create mode 100644 filters/include/pcl/filters/impl/filter.hpp create mode 100644 filters/include/pcl/filters/impl/filter_indices.hpp create mode 100644 filters/include/pcl/filters/impl/normal_space.hpp create mode 100644 filters/include/pcl/filters/impl/passthrough.hpp create mode 100644 filters/include/pcl/filters/impl/plane_clipper3D.hpp create mode 100644 filters/include/pcl/filters/impl/project_inliers.hpp create mode 100644 filters/include/pcl/filters/impl/radius_outlier_removal.hpp create mode 100644 filters/include/pcl/filters/impl/random_sample.hpp create mode 100644 filters/include/pcl/filters/impl/statistical_outlier_removal.hpp create mode 100644 filters/include/pcl/filters/impl/voxel_grid.hpp create mode 100644 filters/include/pcl/filters/normal_space.h create mode 100644 filters/include/pcl/filters/passthrough.h create mode 100644 filters/include/pcl/filters/plane_clipper3D.h create mode 100644 filters/include/pcl/filters/project_inliers.h create mode 100644 filters/include/pcl/filters/radius_outlier_removal.h create mode 100644 filters/include/pcl/filters/random_sample.h create mode 100644 filters/include/pcl/filters/statistical_outlier_removal.h create mode 100644 filters/include/pcl/filters/voxel_grid.h create mode 100644 filters/src/approximate_voxel_grid.cpp create mode 100644 filters/src/bilateral.cpp create mode 100644 filters/src/conditional_removal.cpp create mode 100644 filters/src/crop_box.cpp create mode 100644 filters/src/crop_hull.cpp create mode 100644 filters/src/extract_indices.cpp create mode 100644 filters/src/filter.cpp create mode 100644 filters/src/filter_indices.cpp create mode 100644 filters/src/normal_space.cpp create mode 100644 filters/src/passthrough.cpp create mode 100644 filters/src/project_inliers.cpp create mode 100644 filters/src/radius_outlier_removal.cpp create mode 100644 filters/src/random_sample.cpp create mode 100644 filters/src/statistical_outlier_removal.cpp create mode 100644 filters/src/voxel_grid.cpp create mode 100644 filters/test/CMakeLists.txt create mode 100644 filters/tools/CMakeLists.txt create mode 100644 geometry/CMakeLists.txt create mode 100644 geometry/geometry.doxy create mode 100644 geometry/include/pcl/geometry/impl/polygon_operations.hpp create mode 100644 geometry/include/pcl/geometry/line_iterator.h create mode 100644 geometry/include/pcl/geometry/organized_index_iterator.h create mode 100644 geometry/include/pcl/geometry/planar_polygon.h create mode 100644 geometry/include/pcl/geometry/polygon_operations.h create mode 100644 geometry/src/geometry.cpp create mode 100644 geometry/test/CMakeLists.txt create mode 100644 geometry/test/test_iterator.cpp create mode 100644 io/CMakeLists.txt create mode 100644 io/include/pcl/compression/color_coding.h create mode 100644 io/include/pcl/compression/compression_profiles.h create mode 100644 io/include/pcl/compression/entropy_range_coder.h create mode 100644 io/include/pcl/compression/impl/entropy_range_coder.hpp create mode 100644 io/include/pcl/compression/impl/octree_pointcloud_compression.hpp create mode 100644 io/include/pcl/compression/octree_pointcloud_compression.h create mode 100644 io/include/pcl/compression/point_coding.h create mode 100644 io/include/pcl/io/file_io.h create mode 100644 io/include/pcl/io/grabber.h create mode 100644 io/include/pcl/io/impl/pcd_io.hpp create mode 100644 io/include/pcl/io/impl/vtk_lib_io.hpp create mode 100644 io/include/pcl/io/io.h create mode 100644 io/include/pcl/io/lzf.h create mode 100644 io/include/pcl/io/obj_io.h create mode 100644 io/include/pcl/io/oni_grabber.h create mode 100644 io/include/pcl/io/openni_camera/openni_depth_image.h create mode 100644 io/include/pcl/io/openni_camera/openni_device.h create mode 100644 io/include/pcl/io/openni_camera/openni_device_kinect.h create mode 100644 io/include/pcl/io/openni_camera/openni_device_oni.h create mode 100644 io/include/pcl/io/openni_camera/openni_device_primesense.h create mode 100644 io/include/pcl/io/openni_camera/openni_device_xtion.h create mode 100644 io/include/pcl/io/openni_camera/openni_driver.h create mode 100644 io/include/pcl/io/openni_camera/openni_exception.h create mode 100644 io/include/pcl/io/openni_camera/openni_image.h create mode 100644 io/include/pcl/io/openni_camera/openni_image_bayer_grbg.h create mode 100644 io/include/pcl/io/openni_camera/openni_image_rgb24.h create mode 100644 io/include/pcl/io/openni_camera/openni_image_yuv_422.h create mode 100644 io/include/pcl/io/openni_camera/openni_ir_image.h create mode 100644 io/include/pcl/io/openni_grabber.h create mode 100644 io/include/pcl/io/pcd_grabber.h create mode 100644 io/include/pcl/io/pcd_io.h create mode 100644 io/include/pcl/io/pcl_io_exception.h create mode 100644 io/include/pcl/io/ply/byte_order.h create mode 100644 io/include/pcl/io/ply/io_operators.h create mode 100644 io/include/pcl/io/ply/ply.h create mode 100644 io/include/pcl/io/ply/ply_parser.h create mode 100644 io/include/pcl/io/ply_io.h create mode 100644 io/include/pcl/io/tar.h create mode 100644 io/include/pcl/io/vtk_io.h create mode 100644 io/include/pcl/io/vtk_lib_io.h create mode 100644 io/io.doxy create mode 100644 io/src/compression.cpp create mode 100644 io/src/lzf.cpp create mode 100644 io/src/obj_io.cpp create mode 100644 io/src/oni_grabber.cpp create mode 100644 io/src/openni_camera/openni_depth_image.cpp create mode 100644 io/src/openni_camera/openni_device.cpp create mode 100644 io/src/openni_camera/openni_device_kinect.cpp create mode 100644 io/src/openni_camera/openni_device_oni.cpp create mode 100644 io/src/openni_camera/openni_device_primesense.cpp create mode 100644 io/src/openni_camera/openni_device_xtion.cpp create mode 100644 io/src/openni_camera/openni_driver.cpp create mode 100644 io/src/openni_camera/openni_exception.cpp create mode 100644 io/src/openni_camera/openni_image_bayer_grbg.cpp create mode 100644 io/src/openni_camera/openni_image_rgb24.cpp create mode 100644 io/src/openni_camera/openni_image_yuv_422.cpp create mode 100644 io/src/openni_camera/openni_ir_image.cpp create mode 100644 io/src/openni_grabber.cpp create mode 100644 io/src/pcd_grabber.cpp create mode 100644 io/src/pcd_io.cpp create mode 100644 io/src/ply/ply_parser.cpp create mode 100644 io/src/ply_io.cpp create mode 100644 io/src/vtk_io.cpp create mode 100644 io/src/vtk_lib_io.cpp create mode 100644 io/test/CMakeLists.txt create mode 100644 io/test/test_io.cpp create mode 100644 io/test/test_iterators.cpp create mode 100644 io/test/test_range_coder.cpp create mode 100644 io/tools/CMakeLists.txt create mode 100644 io/tools/convert_pcd_ascii_binary.cpp create mode 100644 io/tools/openni_grabber_example.cpp create mode 100644 io/tools/openni_io.cpp create mode 100644 io/tools/pcd_convert_NaN_nan.cpp create mode 100644 io/tools/ply/CMakeLists.txt create mode 100644 io/tools/ply/ply2obj.cpp create mode 100644 io/tools/ply/ply2ply.cpp create mode 100644 io/tools/ply/ply2raw.cpp create mode 100644 io/tools/ply/plyheader.cpp create mode 100644 kdtree/CMakeLists.txt create mode 100644 kdtree/include/pcl/kdtree/flann.h create mode 100644 kdtree/include/pcl/kdtree/impl/io.hpp create mode 100644 kdtree/include/pcl/kdtree/impl/kdtree_flann.hpp create mode 100644 kdtree/include/pcl/kdtree/io.h create mode 100644 kdtree/include/pcl/kdtree/kdtree.h create mode 100644 kdtree/include/pcl/kdtree/kdtree_flann.h create mode 100644 kdtree/kdtree.doxy create mode 100644 kdtree/src/kdtree_flann.cpp create mode 100644 kdtree/test/CMakeLists.txt create mode 100644 kdtree/test/test_kdtree.cpp create mode 100644 keypoints/CMakeLists.txt create mode 100644 keypoints/include/pcl/keypoints/harris_keypoint3D.h create mode 100644 keypoints/include/pcl/keypoints/impl/harris_keypoint3D.hpp create mode 100644 keypoints/include/pcl/keypoints/impl/keypoint.hpp create mode 100644 keypoints/include/pcl/keypoints/impl/sift_keypoint.hpp create mode 100644 keypoints/include/pcl/keypoints/impl/smoothed_surfaces_keypoint.hpp create mode 100644 keypoints/include/pcl/keypoints/impl/uniform_sampling.hpp create mode 100644 keypoints/include/pcl/keypoints/keypoint.h create mode 100644 keypoints/include/pcl/keypoints/narf_keypoint.h create mode 100644 keypoints/include/pcl/keypoints/sift_keypoint.h create mode 100644 keypoints/include/pcl/keypoints/smoothed_surfaces_keypoint.h create mode 100644 keypoints/include/pcl/keypoints/uniform_sampling.h create mode 100644 keypoints/keypoints.doxy create mode 100644 keypoints/src/harris_keypoint3D.cpp create mode 100644 keypoints/src/narf_keypoint.cpp create mode 100644 keypoints/src/sift_keypoint.cpp create mode 100644 keypoints/src/smoothed_surfaces_keypoint.cpp create mode 100644 keypoints/src/uniform_sampling.cpp create mode 100644 keypoints/test/CMakeLists.txt create mode 100644 octree/CMakeLists.txt create mode 100644 octree/include/pcl/octree/impl/octree2buf_base.hpp create mode 100644 octree/include/pcl/octree/impl/octree_base.hpp create mode 100644 octree/include/pcl/octree/impl/octree_iterator.hpp create mode 100644 octree/include/pcl/octree/impl/octree_pointcloud.hpp create mode 100644 octree/include/pcl/octree/impl/octree_search.hpp create mode 100644 octree/include/pcl/octree/octree.h create mode 100644 octree/include/pcl/octree/octree2buf_base.h create mode 100644 octree/include/pcl/octree/octree_base.h create mode 100644 octree/include/pcl/octree/octree_container.h create mode 100644 octree/include/pcl/octree/octree_impl.h create mode 100644 octree/include/pcl/octree/octree_iterator.h create mode 100644 octree/include/pcl/octree/octree_key.h create mode 100644 octree/include/pcl/octree/octree_node_pool.h create mode 100644 octree/include/pcl/octree/octree_nodes.h create mode 100644 octree/include/pcl/octree/octree_pointcloud.h create mode 100644 octree/include/pcl/octree/octree_pointcloud_changedetector.h create mode 100644 octree/include/pcl/octree/octree_pointcloud_density.h create mode 100644 octree/include/pcl/octree/octree_pointcloud_occupancy.h create mode 100644 octree/include/pcl/octree/octree_pointcloud_pointvector.h create mode 100644 octree/include/pcl/octree/octree_pointcloud_singlepoint.h create mode 100644 octree/include/pcl/octree/octree_pointcloud_voxelcentroid.h create mode 100644 octree/include/pcl/octree/octree_search.h create mode 100644 octree/octree.doxy create mode 100644 octree/src/octree_impl.cpp create mode 100644 octree/test/CMakeLists.txt create mode 100644 octree/test/test_octree.cpp create mode 100644 pcl_config.h.in create mode 100644 registration/CMakeLists.txt create mode 100644 registration/include/pcl/registration/correspondence_estimation.h create mode 100644 registration/include/pcl/registration/correspondence_estimation_normal_shooting.h create mode 100644 registration/include/pcl/registration/correspondence_rejection.h create mode 100644 registration/include/pcl/registration/correspondence_rejection_distance.h create mode 100644 registration/include/pcl/registration/correspondence_rejection_features.h create mode 100644 registration/include/pcl/registration/correspondence_rejection_median_distance.h create mode 100644 registration/include/pcl/registration/correspondence_rejection_one_to_one.h create mode 100644 registration/include/pcl/registration/correspondence_rejection_sample_consensus.h create mode 100644 registration/include/pcl/registration/correspondence_rejection_surface_normal.h create mode 100644 registration/include/pcl/registration/correspondence_rejection_trimmed.h create mode 100644 registration/include/pcl/registration/correspondence_rejection_var_trimmed.h create mode 100644 registration/include/pcl/registration/correspondence_sorting.h create mode 100644 registration/include/pcl/registration/correspondence_types.h create mode 100644 registration/include/pcl/registration/distances.h create mode 100644 registration/include/pcl/registration/elch.h create mode 100644 registration/include/pcl/registration/exceptions.h create mode 100644 registration/include/pcl/registration/gicp.h create mode 100644 registration/include/pcl/registration/ia_ransac.h create mode 100644 registration/include/pcl/registration/icp.h create mode 100644 registration/include/pcl/registration/icp_nl.h create mode 100644 registration/include/pcl/registration/impl/correspondence_estimation.hpp create mode 100644 registration/include/pcl/registration/impl/correspondence_estimation_normal_shooting.hpp create mode 100644 registration/include/pcl/registration/impl/correspondence_rejection_distance.hpp create mode 100644 registration/include/pcl/registration/impl/correspondence_rejection_features.hpp create mode 100644 registration/include/pcl/registration/impl/correspondence_rejection_median_distance.hpp create mode 100644 registration/include/pcl/registration/impl/correspondence_rejection_one_to_one.hpp create mode 100644 registration/include/pcl/registration/impl/correspondence_rejection_sample_consensus.hpp create mode 100644 registration/include/pcl/registration/impl/correspondence_rejection_surface_normal.hpp create mode 100644 registration/include/pcl/registration/impl/correspondence_rejection_trimmed.hpp create mode 100644 registration/include/pcl/registration/impl/correspondence_rejection_var_trimmed.hpp create mode 100644 registration/include/pcl/registration/impl/correspondence_types.hpp create mode 100644 registration/include/pcl/registration/impl/elch.hpp create mode 100644 registration/include/pcl/registration/impl/gicp.hpp create mode 100644 registration/include/pcl/registration/impl/ia_ransac.hpp create mode 100644 registration/include/pcl/registration/impl/icp.hpp create mode 100644 registration/include/pcl/registration/impl/icp_nl.hpp create mode 100644 registration/include/pcl/registration/impl/ppf_registration.hpp create mode 100644 registration/include/pcl/registration/impl/pyramid_feature_matching.hpp create mode 100644 registration/include/pcl/registration/impl/registration.hpp create mode 100644 registration/include/pcl/registration/impl/transformation_estimation_lm.hpp create mode 100644 registration/include/pcl/registration/impl/transformation_estimation_point_to_plane_lls.hpp create mode 100644 registration/include/pcl/registration/impl/transformation_estimation_svd.hpp create mode 100644 registration/include/pcl/registration/impl/transformation_validation_euclidean.hpp create mode 100644 registration/include/pcl/registration/ppf_registration.h create mode 100644 registration/include/pcl/registration/pyramid_feature_matching.h create mode 100644 registration/include/pcl/registration/registration.h create mode 100644 registration/include/pcl/registration/transformation_estimation.h create mode 100644 registration/include/pcl/registration/transformation_estimation_lm.h create mode 100644 registration/include/pcl/registration/transformation_estimation_point_to_plane.h create mode 100644 registration/include/pcl/registration/transformation_estimation_point_to_plane_lls.h create mode 100644 registration/include/pcl/registration/transformation_estimation_svd.h create mode 100644 registration/include/pcl/registration/transformation_validation.h create mode 100644 registration/include/pcl/registration/transformation_validation_euclidean.h create mode 100644 registration/include/pcl/registration/transforms.h create mode 100644 registration/include/pcl/registration/warp_point_rigid.h create mode 100644 registration/include/pcl/registration/warp_point_rigid_3d.h create mode 100644 registration/include/pcl/registration/warp_point_rigid_6d.h create mode 100644 registration/registration.doxy create mode 100644 registration/src/correspondence_estimation.cpp create mode 100644 registration/src/correspondence_estimation_normal_shooting.cpp create mode 100644 registration/src/correspondence_rejection_distance.cpp create mode 100644 registration/src/correspondence_rejection_features.cpp create mode 100644 registration/src/correspondence_rejection_median_distance.cpp create mode 100644 registration/src/correspondence_rejection_one_to_one.cpp create mode 100644 registration/src/correspondence_rejection_sample_consensus.cpp create mode 100644 registration/src/correspondence_rejection_surface_normal.cpp create mode 100644 registration/src/correspondence_rejection_trimmed.cpp create mode 100644 registration/src/correspondence_rejection_var_trimmed.cpp create mode 100644 registration/src/correspondence_types.cpp create mode 100644 registration/src/icp.cpp create mode 100644 registration/src/icp_nl.cpp create mode 100644 registration/src/ppf_registration.cpp create mode 100644 registration/src/pyramid_feature_matching.cpp create mode 100644 registration/src/registration.cpp create mode 100644 registration/src/transformation_estimation_lm.cpp create mode 100644 registration/src/transformation_estimation_point_to_plane_lls.cpp create mode 100644 registration/src/transformation_estimation_svd.cpp create mode 100644 registration/src/transformation_validation_euclidean.cpp create mode 100644 remove_quotes.sh create mode 100644 sample_consensus/CMakeLists.txt create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/lmeds.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/mlesac.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/msac.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/prosac.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/ransac.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/rmsac.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/rransac.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_circle.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_cone.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_cylinder.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_line.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_normal_parallel_plane.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_normal_plane.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_normal_sphere.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_parallel_line.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_parallel_plane.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_perpendicular_plane.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_plane.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_registration.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_sphere.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/impl/sac_model_stick.hpp create mode 100644 sample_consensus/include/pcl/sample_consensus/lmeds.h create mode 100644 sample_consensus/include/pcl/sample_consensus/method_types.h create mode 100644 sample_consensus/include/pcl/sample_consensus/mlesac.h create mode 100644 sample_consensus/include/pcl/sample_consensus/model_types.h create mode 100644 sample_consensus/include/pcl/sample_consensus/msac.h create mode 100644 sample_consensus/include/pcl/sample_consensus/prosac.h create mode 100644 sample_consensus/include/pcl/sample_consensus/ransac.h create mode 100644 sample_consensus/include/pcl/sample_consensus/rmsac.h create mode 100644 sample_consensus/include/pcl/sample_consensus/rransac.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_circle.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_cone.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_cylinder.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_line.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_normal_parallel_plane.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_normal_plane.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_normal_sphere.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_parallel_line.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_parallel_plane.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_perpendicular_plane.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_plane.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_registration.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_sphere.h create mode 100644 sample_consensus/include/pcl/sample_consensus/sac_model_stick.h create mode 100644 sample_consensus/sample_consensus.doxy create mode 100644 sample_consensus/src/lmeds.cpp create mode 100644 sample_consensus/src/mlesac.cpp create mode 100644 sample_consensus/src/msac.cpp create mode 100644 sample_consensus/src/prosac.cpp create mode 100644 sample_consensus/src/ransac.cpp create mode 100644 sample_consensus/src/rmsac.cpp create mode 100644 sample_consensus/src/rransac.cpp create mode 100644 sample_consensus/src/sac_model_circle.cpp create mode 100644 sample_consensus/src/sac_model_cone.cpp create mode 100644 sample_consensus/src/sac_model_cylinder.cpp create mode 100644 sample_consensus/src/sac_model_line.cpp create mode 100644 sample_consensus/src/sac_model_normal_parallel_plane.cpp create mode 100644 sample_consensus/src/sac_model_normal_plane.cpp create mode 100644 sample_consensus/src/sac_model_normal_sphere.cpp create mode 100644 sample_consensus/src/sac_model_parallel_line.cpp create mode 100644 sample_consensus/src/sac_model_parallel_plane.cpp create mode 100644 sample_consensus/src/sac_model_perpendicular_plane.cpp create mode 100644 sample_consensus/src/sac_model_plane.cpp create mode 100644 sample_consensus/src/sac_model_registration.cpp create mode 100644 sample_consensus/src/sac_model_sphere.cpp create mode 100644 sample_consensus/src/sac_model_stick.cpp create mode 100644 search/CMakeLists.txt create mode 100644 search/include/pcl/search/brute_force.h create mode 100644 search/include/pcl/search/flann_search.h create mode 100644 search/include/pcl/search/impl/brute_force.hpp create mode 100644 search/include/pcl/search/impl/flann_search.hpp create mode 100644 search/include/pcl/search/impl/organized.hpp create mode 100644 search/include/pcl/search/kdtree.h create mode 100644 search/include/pcl/search/octree.h create mode 100644 search/include/pcl/search/organized.h create mode 100644 search/include/pcl/search/pcl_search.h create mode 100644 search/include/pcl/search/search.h create mode 100644 search/search.doxy create mode 100644 search/src/brute_force.cpp create mode 100644 search/src/kdtree.cpp create mode 100644 search/src/octree.cpp create mode 100644 search/src/organized.cpp create mode 100644 search/test/CMakeLists.txt create mode 100644 search/test/test_flann_search.cpp create mode 100644 search/test/test_kdtree.cpp create mode 100644 search/test/test_octree.cpp create mode 100644 search/test/test_organized.cpp create mode 100644 segmentation/CMakeLists.txt create mode 100644 segmentation/include/pcl/segmentation/comparator.h create mode 100644 segmentation/include/pcl/segmentation/edge_aware_plane_comparator.h create mode 100644 segmentation/include/pcl/segmentation/euclidean_cluster_comparator.h create mode 100644 segmentation/include/pcl/segmentation/euclidean_plane_coefficient_comparator.h create mode 100644 segmentation/include/pcl/segmentation/extract_clusters.h create mode 100644 segmentation/include/pcl/segmentation/extract_labeled_clusters.h create mode 100644 segmentation/include/pcl/segmentation/extract_polygonal_prism_data.h create mode 100644 segmentation/include/pcl/segmentation/impl/extract_clusters.hpp create mode 100644 segmentation/include/pcl/segmentation/impl/extract_labeled_clusters.hpp create mode 100644 segmentation/include/pcl/segmentation/impl/extract_polygonal_prism_data.hpp create mode 100644 segmentation/include/pcl/segmentation/impl/organized_connected_component_segmentation.hpp create mode 100644 segmentation/include/pcl/segmentation/impl/organized_multi_plane_segmentation.hpp create mode 100644 segmentation/include/pcl/segmentation/impl/planar_polygon_fusion.hpp create mode 100644 segmentation/include/pcl/segmentation/impl/sac_segmentation.hpp create mode 100644 segmentation/include/pcl/segmentation/impl/segment_differences.hpp create mode 100644 segmentation/include/pcl/segmentation/organized_connected_component_segmentation.h create mode 100644 segmentation/include/pcl/segmentation/organized_multi_plane_segmentation.h create mode 100644 segmentation/include/pcl/segmentation/planar_polygon_fusion.h create mode 100644 segmentation/include/pcl/segmentation/planar_region.h create mode 100644 segmentation/include/pcl/segmentation/plane_coefficient_comparator.h create mode 100644 segmentation/include/pcl/segmentation/plane_refinement_comparator.h create mode 100644 segmentation/include/pcl/segmentation/region_3d.h create mode 100644 segmentation/include/pcl/segmentation/rgb_plane_coefficient_comparator.h create mode 100644 segmentation/include/pcl/segmentation/sac_segmentation.h create mode 100644 segmentation/include/pcl/segmentation/segment_differences.h create mode 100644 segmentation/segmentation.doxy create mode 100644 segmentation/src/extract_clusters.cpp create mode 100644 segmentation/src/extract_polygonal_prism_data.cpp create mode 100644 segmentation/src/organized_connected_component_segmentation.cpp create mode 100644 segmentation/src/organized_multi_plane_segmentation.cpp create mode 100644 segmentation/src/planar_polygon_fusion.cpp create mode 100644 segmentation/src/sac_segmentation.cpp create mode 100644 segmentation/src/segment_differences.cpp create mode 100644 surface/CMakeLists.txt create mode 100644 surface/include/pcl/surface/bilateral_upsampling.h create mode 100644 surface/include/pcl/surface/concave_hull.h create mode 100644 surface/include/pcl/surface/convex_hull.h create mode 100644 surface/include/pcl/surface/ear_clipping.h create mode 100644 surface/include/pcl/surface/gp3.h create mode 100644 surface/include/pcl/surface/grid_projection.h create mode 100644 surface/include/pcl/surface/impl/bilateral_upsampling.hpp create mode 100644 surface/include/pcl/surface/impl/concave_hull.hpp create mode 100644 surface/include/pcl/surface/impl/convex_hull.hpp create mode 100644 surface/include/pcl/surface/impl/gp3.hpp create mode 100644 surface/include/pcl/surface/impl/grid_projection.hpp create mode 100644 surface/include/pcl/surface/impl/marching_cubes.hpp create mode 100644 surface/include/pcl/surface/impl/marching_cubes_hoppe.hpp create mode 100644 surface/include/pcl/surface/impl/marching_cubes_rbf.hpp create mode 100644 surface/include/pcl/surface/impl/mls.hpp create mode 100644 surface/include/pcl/surface/impl/mls_omp.hpp create mode 100644 surface/include/pcl/surface/impl/organized_fast_mesh.hpp create mode 100644 surface/include/pcl/surface/impl/poisson.hpp create mode 100644 surface/include/pcl/surface/impl/poisson/function_data.hpp create mode 100644 surface/include/pcl/surface/impl/poisson/geometry.hpp create mode 100644 surface/include/pcl/surface/impl/poisson/multi_grid_octree_data.hpp create mode 100644 surface/include/pcl/surface/impl/poisson/octree_poisson.hpp create mode 100644 surface/include/pcl/surface/impl/poisson/polynomial.hpp create mode 100644 surface/include/pcl/surface/impl/poisson/ppolynomial.hpp create mode 100644 surface/include/pcl/surface/impl/poisson/sparse_matrix.hpp create mode 100644 surface/include/pcl/surface/impl/poisson/vector.hpp create mode 100644 surface/include/pcl/surface/impl/processing.hpp create mode 100644 surface/include/pcl/surface/impl/reconstruction.hpp create mode 100644 surface/include/pcl/surface/impl/surfel_smoothing.hpp create mode 100644 surface/include/pcl/surface/impl/texture_mapping.hpp create mode 100644 surface/include/pcl/surface/marching_cubes.h create mode 100644 surface/include/pcl/surface/marching_cubes_hoppe.h create mode 100644 surface/include/pcl/surface/marching_cubes_rbf.h create mode 100644 surface/include/pcl/surface/mls.h create mode 100644 surface/include/pcl/surface/mls_omp.h create mode 100644 surface/include/pcl/surface/organized_fast_mesh.h create mode 100644 surface/include/pcl/surface/poisson.h create mode 100644 surface/include/pcl/surface/poisson/allocator.h create mode 100644 surface/include/pcl/surface/poisson/binary_node.h create mode 100644 surface/include/pcl/surface/poisson/factor.h create mode 100644 surface/include/pcl/surface/poisson/function_data.h create mode 100644 surface/include/pcl/surface/poisson/geometry.h create mode 100644 surface/include/pcl/surface/poisson/hash.h create mode 100644 surface/include/pcl/surface/poisson/marching_cubes_poisson.h create mode 100644 surface/include/pcl/surface/poisson/multi_grid_octree_data.h create mode 100644 surface/include/pcl/surface/poisson/octree_poisson.h create mode 100644 surface/include/pcl/surface/poisson/polynomial.h create mode 100644 surface/include/pcl/surface/poisson/ppolynomial.h create mode 100644 surface/include/pcl/surface/poisson/sparse_matrix.h create mode 100644 surface/include/pcl/surface/poisson/vector.h create mode 100644 surface/include/pcl/surface/processing.h create mode 100644 surface/include/pcl/surface/qhull.h create mode 100644 surface/include/pcl/surface/reconstruction.h create mode 100644 surface/include/pcl/surface/simplification_remove_unused_vertices.h create mode 100644 surface/include/pcl/surface/surfel_smoothing.h create mode 100644 surface/include/pcl/surface/texture_mapping.h create mode 100644 surface/include/pcl/surface/vtk_smoothing/vtk.h create mode 100644 surface/include/pcl/surface/vtk_smoothing/vtk_mesh_smoothing_laplacian.h create mode 100644 surface/include/pcl/surface/vtk_smoothing/vtk_mesh_smoothing_windowed_sinc.h create mode 100644 surface/include/pcl/surface/vtk_smoothing/vtk_mesh_subdivision.h create mode 100644 surface/include/pcl/surface/vtk_smoothing/vtk_utils.h create mode 100644 surface/src/bilateral_upsampling.cpp create mode 100644 surface/src/concave_hull.cpp create mode 100644 surface/src/convex_hull.cpp create mode 100644 surface/src/ear_clipping.cpp create mode 100644 surface/src/gp3.cpp create mode 100644 surface/src/grid_projection.cpp create mode 100644 surface/src/marching_cubes.cpp create mode 100644 surface/src/marching_cubes_hoppe.cpp create mode 100644 surface/src/marching_cubes_rbf.cpp create mode 100644 surface/src/mls.cpp create mode 100644 surface/src/mls_omp.cpp create mode 100644 surface/src/organized_fast_mesh.cpp create mode 100644 surface/src/poisson.cpp create mode 100644 surface/src/poisson/factor.cpp create mode 100644 surface/src/poisson/geometry.cpp create mode 100644 surface/src/poisson/marching_cubes_poisson.cpp create mode 100644 surface/src/processing.cpp create mode 100644 surface/src/simplification_remove_unused_vertices.cpp create mode 100644 surface/src/surfel_smoothing.cpp create mode 100644 surface/src/texture_mapping.cpp create mode 100644 surface/src/vtk_smoothing/vtk_mesh_smoothing_laplacian.cpp create mode 100644 surface/src/vtk_smoothing/vtk_mesh_smoothing_windowed_sinc.cpp create mode 100644 surface/src/vtk_smoothing/vtk_mesh_subdivision.cpp create mode 100644 surface/src/vtk_smoothing/vtk_utils.cpp create mode 100644 surface/surface.doxy create mode 100644 test/CMakeLists.txt create mode 100644 test/bun0.pcd create mode 100644 test/bun4.pcd create mode 100644 test/bunny.pcd create mode 100644 test/cturtle.pcd create mode 100644 test/features/CMakeLists.txt create mode 100644 test/features/test_base_feature.cpp create mode 100644 test/features/test_boundary_estimation.cpp create mode 100644 test/features/test_curvatures_estimation.cpp create mode 100644 test/features/test_cvfh_estimation.cpp create mode 100644 test/features/test_gradient_estimation.cpp create mode 100644 test/features/test_invariants_estimation.cpp create mode 100644 test/features/test_normal_estimation.cpp create mode 100644 test/features/test_pfh_estimation.cpp create mode 100644 test/features/test_ppf_estimation.cpp create mode 100644 test/features/test_rift_estimation.cpp create mode 100644 test/features/test_shot_estimation.cpp create mode 100644 test/features/test_spin_estimation.cpp create mode 100644 test/milk.pcd create mode 100644 test/nhood_test.pcd create mode 100644 test/noisy_slice_displaced.pcd create mode 100644 test/pcl_logo.pcd create mode 100644 test/sac_plane_test.pcd create mode 100644 test/table_scene_mug_stereo_textured.pcd create mode 100644 test/test_auto_search.cpp create mode 100644 test/test_correspondence_estimation.cpp create mode 100644 test/test_filters.cpp create mode 100644 test/test_ii_normals.cpp create mode 100644 test/test_keypoints.cpp create mode 100644 test/test_non_linear.cpp create mode 100644 test/test_organized_index.cpp create mode 100644 test/test_registration.cpp create mode 100644 test/test_registration_api.cpp create mode 100644 test/test_registration_api_data.h create mode 100644 test/test_sample_consensus.cpp create mode 100644 test/test_search.cpp create mode 100644 test/test_segmentation.cpp create mode 100644 test/test_surface.cpp create mode 100644 test/test_transforms.cpp create mode 100644 tools/CMakeLists.txt create mode 100644 tools/add_gaussian_noise.cpp create mode 100644 tools/bilateral_upsampling.cpp create mode 100644 tools/boundary_estimation.cpp create mode 100644 tools/cluster_extraction.cpp create mode 100644 tools/compute_cloud_error.cpp create mode 100644 tools/concatenate_points_pcd.cpp create mode 100644 tools/convert_pcd_to_image.cpp create mode 100644 tools/crop_to_hull.cpp create mode 100644 tools/elch.cpp create mode 100644 tools/extract_feature.cpp create mode 100644 tools/fpfh_estimation.cpp create mode 100644 tools/gp3_surface.cpp create mode 100644 tools/icp.cpp create mode 100644 tools/icp2d.cpp create mode 100644 tools/marching_cubes_reconstruction.cpp create mode 100644 tools/mesh2pcd.cpp create mode 100644 tools/mesh_sampling.cpp create mode 100644 tools/mls_smoothing.cpp create mode 100644 tools/normal_estimation.cpp create mode 100644 tools/octree_viewer.cpp create mode 100644 tools/openni_save_image.cpp create mode 100644 tools/outlier_removal.cpp create mode 100644 tools/passthrough_filter.cpp create mode 100644 tools/pcd2ply.cpp create mode 100644 tools/pcd2vtk.cpp create mode 100644 tools/pcl_video.cpp create mode 100644 tools/plane_projection.cpp create mode 100644 tools/ply2pcd.cpp create mode 100644 tools/poisson_reconstruction.cpp create mode 100644 tools/registration_visualizer.cpp create mode 100644 tools/spin_estimation.cpp create mode 100644 tools/transform_from_viewpoint.cpp create mode 100644 tools/transform_point_cloud.cpp create mode 100644 tools/vfh_estimation.cpp create mode 100644 tools/virtual_scanner.cpp create mode 100644 tools/voxel_grid.cpp create mode 100644 tracking/CMakeLists.txt create mode 100644 tracking/include/pcl/tracking/approx_nearest_pair_point_cloud_coherence.h create mode 100644 tracking/include/pcl/tracking/coherence.h create mode 100644 tracking/include/pcl/tracking/distance_coherence.h create mode 100644 tracking/include/pcl/tracking/hsv_color_coherence.h create mode 100644 tracking/include/pcl/tracking/impl/approx_nearest_pair_point_cloud_coherence.hpp create mode 100644 tracking/include/pcl/tracking/impl/coherence.hpp create mode 100644 tracking/include/pcl/tracking/impl/distance_coherence.hpp create mode 100644 tracking/include/pcl/tracking/impl/hsv_color_coherence.hpp create mode 100644 tracking/include/pcl/tracking/impl/kld_adaptive_particle_filter.hpp create mode 100644 tracking/include/pcl/tracking/impl/kld_adaptive_particle_filter_omp.hpp create mode 100644 tracking/include/pcl/tracking/impl/nearest_pair_point_cloud_coherence.hpp create mode 100644 tracking/include/pcl/tracking/impl/normal_coherence.hpp create mode 100644 tracking/include/pcl/tracking/impl/particle_filter.hpp create mode 100644 tracking/include/pcl/tracking/impl/particle_filter_omp.hpp create mode 100644 tracking/include/pcl/tracking/impl/tracker.hpp create mode 100644 tracking/include/pcl/tracking/impl/tracking.hpp create mode 100644 tracking/include/pcl/tracking/kld_adaptive_particle_filter.h create mode 100644 tracking/include/pcl/tracking/kld_adaptive_particle_filter_omp.h create mode 100644 tracking/include/pcl/tracking/nearest_pair_point_cloud_coherence.h create mode 100644 tracking/include/pcl/tracking/normal_coherence.h create mode 100644 tracking/include/pcl/tracking/particle_filter.h create mode 100644 tracking/include/pcl/tracking/particle_filter_omp.h create mode 100644 tracking/include/pcl/tracking/tracker.h create mode 100644 tracking/include/pcl/tracking/tracking.h create mode 100644 tracking/src/approx_nearest_pair_point_cloud_coherence.cpp create mode 100644 tracking/src/distance_coherence.cpp create mode 100644 tracking/src/hsv_color_coherence.cpp create mode 100644 tracking/src/kld_adaptive_particle_filter.cpp create mode 100644 tracking/src/kld_adaptive_particle_filter_omp.cpp create mode 100644 tracking/src/nearest_pair_point_cloud_coherence.cpp create mode 100644 tracking/src/normal_coherence.cpp create mode 100644 tracking/src/particle_filter.cpp create mode 100644 tracking/src/particle_filter_omp.cpp create mode 100644 tracking/src/tracking.cpp create mode 100644 visualization/CMakeLists.txt create mode 100644 visualization/include/pcl/visualization/cloud_viewer.h create mode 100644 visualization/include/pcl/visualization/common/actor_map.h create mode 100644 visualization/include/pcl/visualization/common/common.h create mode 100644 visualization/include/pcl/visualization/common/float_image_utils.h create mode 100644 visualization/include/pcl/visualization/common/impl/shapes.hpp create mode 100644 visualization/include/pcl/visualization/common/io.h create mode 100644 visualization/include/pcl/visualization/common/ren_win_interact_map.h create mode 100644 visualization/include/pcl/visualization/common/shapes.h create mode 100644 visualization/include/pcl/visualization/histogram_visualizer.h create mode 100644 visualization/include/pcl/visualization/image_viewer.h create mode 100644 visualization/include/pcl/visualization/impl/histogram_visualizer.hpp create mode 100644 visualization/include/pcl/visualization/impl/image_viewer.hpp create mode 100644 visualization/include/pcl/visualization/impl/pcl_visualizer.hpp create mode 100644 visualization/include/pcl/visualization/impl/point_cloud_handlers.hpp create mode 100644 visualization/include/pcl/visualization/impl/registration_visualizer.hpp create mode 100644 visualization/include/pcl/visualization/interactor.h create mode 100644 visualization/include/pcl/visualization/interactor_style.h create mode 100644 visualization/include/pcl/visualization/keyboard_event.h create mode 100644 visualization/include/pcl/visualization/mouse_event.h create mode 100644 visualization/include/pcl/visualization/pcl_visualizer.h create mode 100644 visualization/include/pcl/visualization/point_cloud_handlers.h create mode 100644 visualization/include/pcl/visualization/point_picking_event.h create mode 100644 visualization/include/pcl/visualization/range_image_visualizer.h create mode 100644 visualization/include/pcl/visualization/registration_visualizer.h create mode 100644 visualization/include/pcl/visualization/vtk.h create mode 100644 visualization/include/pcl/visualization/vtk/pcl_image_canvas_source_2d.h create mode 100644 visualization/include/pcl/visualization/window.h create mode 100644 visualization/src/cloud_viewer.cpp create mode 100644 visualization/src/common/common.cpp create mode 100644 visualization/src/common/float_image_utils.cpp create mode 100644 visualization/src/common/io.cpp create mode 100644 visualization/src/common/shapes.cpp create mode 100644 visualization/src/histogram_visualizer.cpp create mode 100644 visualization/src/image_viewer.cpp create mode 100644 visualization/src/interactor.cpp create mode 100644 visualization/src/interactor_style.cpp create mode 100644 visualization/src/pcl_visualizer.cpp create mode 100644 visualization/src/point_cloud_handlers.cpp create mode 100644 visualization/src/point_picking_event.cpp create mode 100644 visualization/src/range_image_visualizer.cpp create mode 100644 visualization/src/vtk/pcl_image_canvas_source_2d.cpp create mode 100644 visualization/src/window.cpp create mode 100644 visualization/test/CMakeLists.txt create mode 100644 visualization/test/test.cpp create mode 100644 visualization/test/test_geometry.cpp create mode 100644 visualization/test/test_shapes.cpp create mode 100644 visualization/tools/CMakeLists.txt create mode 100644 visualization/tools/oni_viewer_simple.cpp create mode 100644 visualization/tools/openni_image.cpp create mode 100644 visualization/tools/openni_viewer.cpp create mode 100644 visualization/tools/openni_viewer_simple.cpp create mode 100644 visualization/tools/pcd_grabber_viewer.cpp create mode 100644 visualization/tools/pcd_viewer.cpp create mode 100644 visualization/tools/timed_trigger_test.cpp create mode 100644 visualization/visualization.doxy diff --git a/AUTHORS.txt b/AUTHORS.txt new file mode 100644 index 00000000..c8501be2 --- /dev/null +++ b/AUTHORS.txt @@ -0,0 +1,4 @@ +PCL is a large collaborative effort, and it would not exist without the +contributions of several people. Please see http://dev.pointclouds.org for a +complete list of developers. + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..8a735bcd --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,275 @@ +### ---[ PCL global CMake +cmake_minimum_required(VERSION 2.8 FATAL_ERROR) +set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "possible configurations" FORCE) +# In case the user does not setup CMAKE_BUILD_TYPE, assume it's RelWithDebInfo +if("${CMAKE_BUILD_TYPE}" STREQUAL "") + set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "build type default to RelWithDebInfo, set to Release to improve performance" FORCE) +endif("${CMAKE_BUILD_TYPE}" STREQUAL "") + +project(PCL) +string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER) + +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/" ${CMAKE_MODULE_PATH}) + +# ---[ Release/Debug specific flags +if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") + add_definitions("-DBOOST_DISABLE_ASSERTS -DEIGEN_NO_DEBUG") +endif() +if(WIN32) + if(NOT DEFINED CMAKE_DEBUG_POSTFIX) + set(CMAKE_DEBUG_POSTFIX "_debug") + endif() + if(NOT DEFINED CMAKE_RELEASE_POSTFIX) + set(CMAKE_RELEASE_POSTFIX "_release") + endif() +endif() + +# ---[ special maintainer mode +SET(CMAKE_CXX_FLAGS_MAINTAINER "-pedantic -Wno-variadic-macros -Wabi -Wextra -Weffc++" CACHE STRING + "Flags used by the C++ compiler during maintainer builds." + FORCE) +SET(CMAKE_C_FLAGS_MAINTAINER "-pedantic -Wno-variadic-macros -Wabi -Wextra -Weffc++" CACHE STRING + "Flags used by the C compiler during maintainer builds." + FORCE) +SET(CMAKE_EXE_LINKER_FLAGS_MAINTAINER + "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING + "Flags used for linking binaries during maintainer builds." + FORCE) +SET(CMAKE_SHARED_LINKER_FLAGS_MAINTAINER + "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING + "Flags used by the shared libraries linker during maintainer builds." + FORCE) +MARK_AS_ADVANCED( + CMAKE_CXX_FLAGS_MAINTAINER + CMAKE_C_FLAGS_MAINTAINER + CMAKE_EXE_LINKER_FLAGS_MAINTAINER + CMAKE_SHARED_LINKER_FLAGS_MAINTAINER ) +# Update the documentation string of CMAKE_BUILD_TYPE for GUIs +SET(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING + "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Maintainer." + FORCE) + +# ---[ Android check +if (ANDROID_NDK) + set (PCL_SHARED_LIBS OFF) + message ("PCL shared libs on Android must be: ${PCL_SHARED_LIBS}") +endif() + +include(${PCL_SOURCE_DIR}/cmake/pcl_targets.cmake) +include(${PCL_SOURCE_DIR}/cmake/pcl_options.cmake) + +# ---[ Unix/Darwin/Windows specific flags +if(CMAKE_COMPILER_IS_GNUCXX) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-unknown-pragmas -fno-strict-aliasing -pthread") + if(WIN32) + if(PCL_SHARED_LIBS) + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--export-all-symbols -Wl,--enable-auto-import") + else(PCL_SHARED_LIBS) + add_definitions("-DBOOST_LIB_DIAGNOSTIC -DBOOST_THREAD_USE_LIB") + endif(PCL_SHARED_LIBS) + endif() +endif() + +if(MSVC) + add_definitions ("-DBOOST_ALL_NO_LIB -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -DNOMINMAX") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj /EHsc /fp:fast /wd4800 /wd4521 /wd4251 /wd4275") + SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL /wd4800") + SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /LTCG") + SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG") + if(MSVC90 OR MSVC10) + option(ENABLE_MULTI_PROCESSOR_COMPILATION "Enable multi-processor compilation." ON) + mark_as_advanced(ENABLE_MULTI_PROCESSOR_COMPILATION) + if(ENABLE_MULTI_PROCESSOR_COMPILATION) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + endif(ENABLE_MULTI_PROCESSOR_COMPILATION) + endif() +endif() + +# check for SSE flags +include(${PCL_SOURCE_DIR}/cmake/pcl_find_sse.cmake) +PCL_CHECK_FOR_SSE() + +if (__COMPILER_PATHSCALE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-uninitialized -zerouv -pthread -mp") +endif() + +if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +endif() + +# ---[ Project folders +option(USE_PROJECT_FOLDERS "Use folders to organize PCL projects in an IDE." OFF) +mark_as_advanced(USE_PROJECT_FOLDERS) +if(USE_PROJECT_FOLDERS) + set_property(GLOBAL PROPERTY USE_FOLDERS ON) +endif(USE_PROJECT_FOLDERS) + +include(${PCL_SOURCE_DIR}/cmake/pcl_utils.cmake) +set(PCL_VERSION 1.6.0 CACHE STRING "PCL version") +DISSECT_VERSION() +GET_OS_INFO() +SET_INSTALL_DIRS() + +if(WIN32) + set(PCL_RESOURCES_DIR ${PCL_SOURCE_DIR}/resources) + set(PCL_POINTCLOUDS_DIR ${PCL_RESOURCES_DIR}/pointclouds) +endif(WIN32) + +set(PCL_OUTPUT_LIB_DIR ${PCL_BINARY_DIR}/${LIB_INSTALL_DIR}) +set(PCL_OUTPUT_BIN_DIR ${PCL_BINARY_DIR}/${BIN_INSTALL_DIR}) +make_directory(${PCL_OUTPUT_LIB_DIR}) +make_directory(${PCL_OUTPUT_BIN_DIR}) +if(WIN32) + foreach(config ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${config} CONFIG) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONFIG} "${PCL_OUTPUT_LIB_DIR}") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIG} "${PCL_OUTPUT_BIN_DIR}") + # ---[ Windows requires DLLs (shared libraries) to be installed in the same directory as executables + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONFIG} "${PCL_OUTPUT_BIN_DIR}") + endforeach(config) +else(WIN32) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PCL_OUTPUT_LIB_DIR}") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PCL_OUTPUT_BIN_DIR}") + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PCL_OUTPUT_LIB_DIR}") +endif(WIN32) + +# Add an "uninstall" target +configure_file("${PCL_SOURCE_DIR}/cmake/uninstall_target.cmake.in" + "${PCL_BINARY_DIR}/uninstall_target.cmake" IMMEDIATE @ONLY) +add_custom_target(uninstall "${CMAKE_COMMAND}" -P + "${PCL_BINARY_DIR}/uninstall_target.cmake") + +### +# this is copy paste form http://www.itk.org/Wiki/CMake_RPATH_handling +# in order to always make a full statement RPATH +### +SET(CMAKE_SKIP_BUILD_RPATH FALSE) +SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) +SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}") +SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}" is_system_dir) +IF("${is_system_dir}" STREQUAL "-1") +SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}") +ENDIF("${is_system_dir}" STREQUAL "-1") + +### ---[ Find universal dependencies +find_package(OpenMP) +if(OPENMP_FOUND) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + set (HAVE_OPENMP 1) + message (STATUS "HAVE_OPENMP status ${HAVE_OPENMP}") + if(MSVC90 OR MSVC10) + if(MSVC90) + set(OPENMP_DLL VCOMP90) + elseif(MSVC10) + set(OPENMP_DLL VCOMP100) + endif(MSVC90) + set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /DELAYLOAD:${OPENMP_DLL}D.dll") + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DELAYLOAD:${OPENMP_DLL}.dll") + endif(MSVC90 OR MSVC10) +else(OPENMP_FOUND) + message (STATUS "Not found OpenMP") +endif() +# Boost (required) +include(${PCL_SOURCE_DIR}/cmake/pcl_find_boost.cmake) +# Eigen (required) +find_package(Eigen REQUIRED) +include_directories(SYSTEM ${EIGEN_INCLUDE_DIRS}) +add_definitions(-DEIGEN_USE_NEW_STDVECTOR + -DEIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET) +# FLANN (required) +if(NOT PCL_SHARED_LIBS OR WIN32) + set(FLANN_USE_STATIC ON) +endif(NOT PCL_SHARED_LIBS OR WIN32) +find_package(FLANN 1.7.0 REQUIRED) +include_directories(SYSTEM ${FLANN_INCLUDE_DIRS}) +# OpenNI +find_package(OpenNI) +# Qhull +if(NOT PCL_SHARED_LIBS OR WIN32) + set(QHULL_USE_STATIC ON) +endif(NOT PCL_SHARED_LIBS OR WIN32) +find_package(Qhull) +# Find ROS +include(${PCL_SOURCE_DIR}/cmake/pcl_find_ros.cmake) +# Find QT4 +find_package(Qt4) +if (QT4_FOUND) + include(${QT_USE_FILE}) +endif (QT4_FOUND) +# Find VTK +find_package(VTK) +if(VTK_FOUND) + if (PCL_SHARED_LIBS OR + (NOT (PCL_SHARED_LIBS) AND NOT (VTK_BUILD_SHARED_LIBS))) + set(VTK_FOUND TRUE) + find_package (QVTK) + message(STATUS "VTK found (include: ${VTK_INCLUDE_DIRS}, lib: ${VTK_LIBRARY_DIRS})") + link_directories(${VTK_LIBRARY_DIRS}) + set(HAVE_VTK ON) + else () + set(VTK_FOUND OFF) + set(HAVE_VTK OFF) + message ("Warning: You are to build PCL in STATIC but VTK is SHARED!") + message ("Warning: VTK disabled!") + endif () +endif(VTK_FOUND) +# Find MPI +find_package(MPI) +if(MPI_CXX_FOUND) + include_directories(SYSTEM ${MPI_INCLUDE_PATH}) +endif(MPI_CXX_FOUND) +#Find Doxygen and html help compiler if any +find_package(Doxygen) +if(DOXYGEN_FOUND) + find_package(HTMLHelp) +endif(DOXYGEN_FOUND) + +### ---[ Create the config.h file +set(pcl_config_h_in "${CMAKE_CURRENT_SOURCE_DIR}/pcl_config.h.in") +set(pcl_config_h "${CMAKE_CURRENT_BINARY_DIR}/include/pcl/pcl_config.h") +configure_file(${pcl_config_h_in} ${pcl_config_h}) +PCL_ADD_INCLUDES(common "" ${pcl_config_h}) +include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) + +### ---[ Set up for tests +include(${PCL_SOURCE_DIR}/cmake/pcl_tests.cmake) + +### ---[ Set up for examples +#include(${PCL_SOURCE_DIR}/cmake/pcl_examples.cmake) + +### ---[ Add the libraries subdirectories +include(${PCL_SOURCE_DIR}/cmake/pcl_targets.cmake) + +collect_subproject_directory_names(${PCL_SOURCE_DIR} "CMakeLists.txt" PCL_MODULES_NAMES PCL_MODULES_DIRS doc) +set(PCL_MODULES_NAMES_UNSORTED ${PCL_MODULES_NAMES}) +topological_sort(PCL_MODULES_NAMES PCL_ _DEPENDS) +sort_relative(PCL_MODULES_NAMES_UNSORTED PCL_MODULES_NAMES PCL_MODULES_DIRS) +foreach(subdir ${PCL_MODULES_DIRS}) + add_subdirectory(${PCL_SOURCE_DIR}/${subdir}) +endforeach(subdir) + +### ---[ Documentation +add_subdirectory(doc) + +### ---[ Configure PCLConfig.cmake +include(${PCL_SOURCE_DIR}/cmake/pcl_pclconfig.cmake) + +### ---[ Package creation +include(${PCL_SOURCE_DIR}/cmake/pcl_all_in_one_installer.cmake) +include(${PCL_SOURCE_DIR}/cmake/pcl_cpack.cmake) + +if(CPACK_GENERATOR) + message(STATUS "Found CPack generators: ${CPACK_GENERATOR}") + PCL_MAKE_CPACK_INPUT() + set(CPACK_PROJECT_CONFIG_FILE "${PCL_CPACK_CFG_FILE}") + include(CPack) +endif(CPACK_GENERATOR) +### ---[ Make a pretty picture of the dependency graph +include(${PCL_SOURCE_DIR}/cmake/dep_graph.cmake) +MAKE_DEP_GRAPH() + +### ---[ Finish up +PCL_WRITE_STATUS_REPORT() +PCL_RESET_MAPS() diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..ca7374b9 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,35 @@ +Software License Agreement (BSD License) + +Point Cloud Library (PCL) - www.pointclouds.org +Copyright (c) 2009-2012, Willow Garage, Inc. +Copyright (c) 2012-, Open Perception, Inc. +Copyright (c) XXX, respective authors. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the copyright holder(s) nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/PCLConfig.cmake.in b/PCLConfig.cmake.in new file mode 100644 index 00000000..60e02046 --- /dev/null +++ b/PCLConfig.cmake.in @@ -0,0 +1,571 @@ +# ------------------------------------------------------------------------------------ +# Helper to use PCL from outside project +# +# target_link_libraries(my_fabulous_target PCL_XXX_LIBRARIES) where XXX is the +# upper cased xxx from : +# @PCLCONFIG_AVAILABLE_COMPONENTS_LIST@ +# +# PCL_INCLUDE_DIRS is filled with PCL and available 3rdparty headers +# PCL_LIBRARY_DIRS is filled with PCL components libraries install directory and +# 3rdparty libraries paths +# +# www.pointclouds.org +#------------------------------------------------------------------------------------ + +### ---[ some useful macros +macro(pcl_report_not_found _reason) + unset(PCL_FOUND) + unset(PCL_LIBRARIES) + unset(PCL_INCLUDE_DIRS) + unset(PCL_LIBRARY_DIRS) + unset(PCL_DEFINITIONS) + if(PCL_FIND_REQUIRED) + message(FATAL_ERROR ${_reason}) + elseif(NOT PCL_FIND_QUIETLY) + message(WARNING ${_reason}) + endif() + return() +endmacro(pcl_report_not_found) + +macro(pcl_message) + if(NOT PCL_FIND_QUIETLY) + message(${ARGN}) + endif(NOT PCL_FIND_QUIETLY) +endmacro(pcl_message) + +# Remove duplicate libraries +macro(pcl_remove_duplicate_libraries _unfiltered_libraries _filtered_libraries) + set(${_filtered_libraries}) + set(_debug_libraries) + set(_optimized_libraries) + set(_other_libraries) + set(_waiting_for_debug 0) + set(_waiting_for_optimized 0) + set(_library_position -1) + foreach(library ${${_unfiltered_libraries}}) + if("${library}" STREQUAL "debug") + set(_waiting_for_debug 1) + elseif("${library}" STREQUAL "optimized") + set(_waiting_for_optimized 1) + elseif(_waiting_for_debug) + list(FIND _debug_libraries "${library}" library_position) + if(library_position EQUAL -1) + list(APPEND ${_filtered_libraries} debug ${library}) + list(APPEND _debug_libraries ${library}) + endif() + set(_waiting_for_debug 0) + elseif(_waiting_for_optimized) + list(FIND _optimized_libraries "${library}" library_position) + if(library_position EQUAL -1) + list(APPEND ${_filtered_libraries} optimized ${library}) + list(APPEND _optimized_libraries ${library}) + endif() + set(_waiting_for_optimized 0) + else("${library}" STREQUAL "debug") + list(FIND _other_libraries "${library}" library_position) + if(library_position EQUAL -1) + list(APPEND ${_filtered_libraries} ${library}) + list(APPEND _other_libraries ${library}) + endif() + endif("${library}" STREQUAL "debug") + endforeach(library) +endmacro(pcl_remove_duplicate_libraries) + +### ---[ 3rd party libraries +macro(find_boost) + if(PCL_ALL_IN_ONE_INSTALLER) + set(BOOST_ROOT "${PCL_ROOT}/3rdParty/Boost") + elseif(NOT BOOST_INCLUDEDIR) + set(BOOST_INCLUDEDIR "@Boost_INCLUDE_DIR@") + endif(PCL_ALL_IN_ONE_INSTALLER) + # use static Boost in Windows + if(WIN32) + set(Boost_USE_STATIC_LIBS ON) + set(Boost_USE_STATIC ON) + endif(WIN32) + if(${CMAKE_VERSION} VERSION_LESS 2.8.5) + SET(Boost_ADDITIONAL_VERSIONS "1.43" "1.43.0" "1.44" "1.44.0" "1.45" "1.45.0" "1.46.1" "1.46.0" "1.46" "1.47" "1.47.0") + else(${CMAKE_VERSION} VERSION_LESS 2.8.5) + SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") + endif(${CMAKE_VERSION} VERSION_LESS 2.8.5) + # Disable the config mode of find_package(Boost) + set(Boost_NO_BOOST_CMAKE ON) + find_package(Boost 1.40.0 ${QUIET_} COMPONENTS system filesystem thread date_time iostreams) + set(BOOST_FOUND ${Boost_FOUND}) + set(BOOST_INCLUDE_DIRS "${Boost_INCLUDE_DIR}") + set(BOOST_LIBRARY_DIRS "${Boost_LIBRARY_DIRS}") + set(BOOST_LIBRARIES ${Boost_LIBRARIES}) + if(WIN32) + set(BOOST_DEFINITIONS ${BOOST_DEFINITIONS} -DBOOST_ALL_NO_LIB) + endif(WIN32) +endmacro(find_boost) + +#remove this as soon as eigen is shipped with FindEigen.cmake +macro(find_eigen) + if(PCL_ALL_IN_ONE_INSTALLER) + set(EIGEN_ROOT "${PCL_ROOT}/3rdParty/Eigen") + elseif(NOT EIGEN_ROOT) + get_filename_component(EIGEN_ROOT "@EIGEN_INCLUDE_DIRS@" PATH) + endif(PCL_ALL_IN_ONE_INSTALLER) + if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_EIGEN eigen3) + endif(PKG_CONFIG_FOUND) + find_path(EIGEN_INCLUDE_DIRS Eigen/Core + HINTS ${PC_EIGEN_INCLUDEDIR} ${PC_EIGEN_INCLUDE_DIRS} + "${EIGEN_ROOT}" "$ENV{EIGEN_ROOT}" + PATHS "$ENV{PROGRAMFILES}/Eigen 3.0.0" "$ENV{PROGRAMW6432}/Eigen 3.0.0" + "$ENV{PROGRAMFILES}/Eigen" "$ENV{PROGRAMW6432}/Eigen" + PATH_SUFFIXES eigen3 include/eigen3 include) + find_package_handle_standard_args(eigen DEFAULT_MSG EIGEN_INCLUDE_DIRS) + set(EIGEN_DEFINITIONS ${EIGEN_DEFINITIONS} -DEIGEN_USE_NEW_STDVECTOR + -DEIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET) +endmacro(find_eigen) + +#remove this as soon as qhull is shipped with FindQhull.cmake +macro(find_qhull) + if(PCL_ALL_IN_ONE_INSTALLER) + set(QHULL_ROOT "${PCL_ROOT}/3rdParty/Qhull") + elseif(NOT QHULL_ROOT) + get_filename_component(QHULL_ROOT "@QHULL_INCLUDE_DIRS@" PATH) + endif(PCL_ALL_IN_ONE_INSTALLER) + set(QHULL_MAJOR_VERSION 6) + + find_path(QHULL_INCLUDE_DIRS + NAMES libqhull/libqhull.h qhull.h + HINTS "${QHULL_ROOT}" "$ENV{QHULL_ROOT}" + PATHS "$ENV{PROGRAMFILES}/qhull" "$ENV{PROGRAMW6432}/qhull" + PATH_SUFFIXES qhull src/libqhull libqhull include) + + # Most likely we are on windows so prefer static libraries over shared ones (Mourad's recommend) + find_library(QHULL_LIBRARY + NAMES qhullstatic qhull qhull${QHULL_MAJOR_VERSION} + HINTS "${QHULL_ROOT}" "$ENV{QHULL_ROOT}" + PATHS "$ENV{PROGRAMFILES}/qhull" "$ENV{PROGRAMW6432}/qhull" + PATH_SUFFIXES project build bin lib) + + find_library(QHULL_LIBRARY_DEBUG + NAMES qhullstatic_d qhull_d qhull${QHULL_MAJOR_VERSION}_d qhull_d${QHULL_MAJOR_VERSION} + qhull qhull${QHULL_MAJOR_VERSION} + HINTS "${QHULL_ROOT}" "$ENV{QHULL_ROOT}" + PATHS "$ENV{PROGRAMFILES}/qhull" "$ENV{PROGRAMW6432}/qhull" + PATH_SUFFIXES project build bin lib) + + find_package_handle_standard_args(qhull DEFAULT_MSG QHULL_LIBRARY QHULL_INCLUDE_DIRS) + + if(QHULL_FOUND) + get_filename_component(QHULL_LIBRARY_PATH ${QHULL_LIBRARY} PATH) + if(QHULL_LIBRARY_DEBUG) + set(QHULL_LIBRARIES optimized ${QHULL_LIBRARY} debug ${QHULL_LIBRARY_DEBUG}) + get_filename_component(QHULL_LIBRARY_DEBUG_PATH ${QHULL_LIBRARY_DEBUG} PATH) + set(QHULL_LIBRARY_DIRS ${QHULL_LIBRARY_PATH} ${QHULL_LIBRARY_DEBUG_PATH}) + else(QHULL_LIBRARY_DEBUG) + set(QHULL_LIBRARIES ${QHULL_LIBRARY}) + set(QHULL_LIBRARY_DIRS ${QHULL_LIBRARY_PATH}) + endif(QHULL_LIBRARY_DEBUG) + set(QHULL_DEFINITIONS) + get_filename_component(qhull_lib ${QHULL_LIBRARY} NAME_WE) + if(NOT "${qhull_lib}" MATCHES "qhullstatic") + set(QHULL_DEFINITIONS ${QHULL_DEFINITIONS} -Dqh_QHpointer) + if(MSVC) + set(QHULL_DEFINITIONS ${QHULL_DEFINITIONS} -Dqh_QHpointer_dllimport) + endif(MSVC) + endif(NOT "${qhull_lib}" MATCHES "qhullstatic") + endif(QHULL_FOUND) +endmacro(find_qhull) + +#remove this as soon as openni-dev is shipped with FindOpenni.cmake +macro(find_openni) + if(NOT OPENNI_ROOT AND ("@HAVE_OPENNI@" STREQUAL "ON")) + set(OPENNI_INCLUDE_DIRS_HINT "@OPENNI_INCLUDE_DIRS@") + set(OPENNI_LIBRARY_HINT "@OPENNI_LIBRARY@") + endif(NOT OPENNI_ROOT AND ("@HAVE_OPENNI@" STREQUAL "ON")) + + if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_OPENNI openni-dev) + endif(PKG_CONFIG_FOUND) + find_path(OPENNI_INCLUDE_DIRS XnStatus.h + HINTS ${PC_OPENNI_INCLUDEDIR} ${PC_OPENNI_INCLUDE_DIRS} + "${OPENNI_ROOT}" "$ENV{OPENNI_ROOT}" + PATHS "$ENV{OPEN_NI_INCLUDE}" "${OPENNI_INCLUDE_DIRS_HINT}" + PATH_SUFFIXES include/openni Include) + #add a hint so that it can find it without the pkg-config + set(OPENNI_SUFFIX) + if(WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 8) + set(OPENNI_SUFFIX 64) + endif(WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 8) + find_library(OPENNI_LIBRARY + NAMES OpenNI64 OpenNI + HINTS ${PC_OPENNI_LIBDIR} ${PC_OPENNI_LIBRARY_DIRS} + "${OPENNI_ROOT}" "$ENV{OPENNI_ROOT}" + PATHS "$ENV{OPEN_NI_LIB${OPENNI_SUFFIX}}" "${OPENNI_LIBRARY_HINT}" + PATH_SUFFIXES lib Lib Lib64) + + find_package_handle_standard_args(openni DEFAULT_MSG OPENNI_LIBRARY OPENNI_INCLUDE_DIRS) + + if(OPENNI_FOUND) + get_filename_component(OPENNI_LIBRARY_PATH ${OPENNI_LIBRARY} PATH) + set(OPENNI_LIBRARY_DIRS ${OPENNI_LIBRARY_PATH}) + set(OPENNI_LIBRARIES "${OPENNI_LIBRARY}") + endif(OPENNI_FOUND) +endmacro(find_openni) + +#remove this as soon as flann is shipped with FindFlann.cmake +macro(find_flann) + if(PCL_ALL_IN_ONE_INSTALLER) + set(FLANN_ROOT "${PCL_ROOT}/3rdParty/Flann") + elseif(NOT FLANN_ROOT) + get_filename_component(FLANN_ROOT "@FLANN_INCLUDE_DIRS@" PATH) + endif(PCL_ALL_IN_ONE_INSTALLER) + if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_FLANN flann) + endif(PKG_CONFIG_FOUND) + + find_path(FLANN_INCLUDE_DIRS flann/flann.hpp + HINTS ${PC_FLANN_INCLUDEDIR} ${PC_FLANN_INCLUDE_DIRS} + "${FLANN_ROOT}" "$ENV{FLANN_ROOT}" + PATHS "$ENV{PROGRAMFILES}/flann 1.6.9" "$ENV{PROGRAMW6432}/flann 1.6.9" + "$ENV{PROGRAMFILES}/flann" "$ENV{PROGRAMW6432}/flann" + PATH_SUFFIXES include) + + find_library(FLANN_LIBRARY + NAMES flann_cpp_s flann_cpp + HINTS ${PC_FLANN_LIBDIR} ${PC_FLANN_LIBRARY_DIRS} "${FLANN_ROOT}" "$ENV{FLANN_ROOT}" + PATHS "$ENV{PROGRAMFILES}/flann 1.6.9" "$ENV{PROGRAMW6432}/flann 1.6.9" + "$ENV{PROGRAMFILES}/flann" "$ENV{PROGRAMW6432}/flann" + PATH_SUFFIXES lib) + + find_library(FLANN_LIBRARY_DEBUG + NAMES flann_cpp_s-gd flann_cpp-gd flann_cpp_s flann_cpp + HINTS ${PC_FLANN_LIBDIR} ${PC_FLANN_LIBRARY_DIRS} "${FLANN_ROOT}" "$ENV{FLANN_ROOT}" + PATHS "$ENV{PROGRAMFILES}/flann 1.6.9" "$ENV{PROGRAMW6432}/flann 1.6.9" + "$ENV{PROGRAMFILES}/flann" "$ENV{PROGRAMW6432}/flann" + PATH_SUFFIXES lib) + + find_package_handle_standard_args(Flann DEFAULT_MSG FLANN_LIBRARY FLANN_INCLUDE_DIRS) + if(FLANN_FOUND) + get_filename_component(FLANN_LIBRARY_PATH ${FLANN_LIBRARY} PATH) + if(FLANN_LIBRARY_DEBUG) + get_filename_component(FLANN_LIBRARY_DEBUG_PATH ${FLANN_LIBRARY_DEBUG} PATH) + set(FLANN_LIBRARY_DIRS ${FLANN_LIBRARY_PATH} ${FLANN_LIBRARY_DEBUG_PATH}) + set(FLANN_LIBRARIES optimized ${FLANN_LIBRARY} debug ${FLANN_LIBRARY_DEBUG}) + else(FLANN_LIBRARY_DEBUG) + set(FLANN_LIBRARY_DIRS ${FLANN_LIBRARY_PATH}) + set(FLANN_LIBRARIES ${FLANN_LIBRARY}) + endif(FLANN_LIBRARY_DEBUG) + if("${FLANN_LIBRARY}" MATCHES "flann_cpp_s") + set(FLANN_DEFINITIONS ${FLANN_DEFINITIONS} -DFLANN_STATIC) + endif("${FLANN_LIBRARY}" MATCHES "flann_cpp_s") + endif(FLANN_FOUND) +endmacro(find_flann) + +macro(find_VTK) + if(PCL_ALL_IN_ONE_INSTALLER) + set(VTK_DIR "${PCL_ROOT}/3rdParty/VTK/lib/vtk-5.8") + elseif(NOT VTK_DIR) + set(VTK_DIR "@VTK_DIR@") + endif(PCL_ALL_IN_ONE_INSTALLER) + find_package(VTK ${QUIET_}) + if (VTK_FOUND AND NOT ANDROID_NDK) + set(VTK_LIBRARIES vtkCommon vtkRendering vtkHybrid) + endif(VTK_FOUND AND NOT ANDROID_NDK) +endmacro(find_VTK) + +macro(find_libusb) + if(NOT WIN32) + find_path(LIBUSB_1_INCLUDE_DIR + NAMES libusb-1.0/libusb.h + PATHS /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES libusb-1.0) + + find_library(LIBUSB_1_LIBRARY + NAMES usb-1.0 + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib) + find_package_handle_standard_args(libusb-1.0 LIBUSB_1_LIBRARY LIBUSB_1_INCLUDE_DIR) + endif(NOT WIN32) +endmacro(find_libusb) + +# Finds each component external libraries if any +# The functioning is as following +# try to find _lib +# |--> _lib found ==> include the headers, +# | link to its library directories or include _lib_USE_FILE +# `--> _lib not found +# |--> _lib is optional ==> disable it (thanks to the guardians) +# | and warn +# `--> _lib is required +# |--> component is required explicitely ==> error +# `--> component is induced ==> warn and remove it +# from the list + +macro(find_external_library _component _lib _is_optional) + if("${_lib}" STREQUAL "boost") + find_boost() + elseif("${_lib}" STREQUAL "eigen") + find_eigen() + elseif("${_lib}" STREQUAL "flann") + find_flann() + elseif("${_lib}" STREQUAL "qhull") + find_qhull() + elseif("${_lib}" STREQUAL "openni") + find_openni() + elseif("${_lib}" STREQUAL "vtk") + find_VTK() + elseif("${_lib}" STREQUAL "libusb-1.0") + find_libusb() + endif("${_lib}" STREQUAL "boost") + + string(TOUPPER "${_component}" COMPONENT) + string(TOUPPER "${_lib}" LIB) + if(${LIB}_FOUND) + list(APPEND PCL_${COMPONENT}_INCLUDE_DIRS ${${LIB}_INCLUDE_DIRS}) + if(${LIB}_USE_FILE) + include(${${LIB}_USE_FILE}) + else(${LIB}_USE_FILE) + list(APPEND PCL_${COMPONENT}_LIBRARY_DIRS "${${LIB}_LIBRARY_DIRS}") + endif(${LIB}_USE_FILE) + if(${LIB}_LIBRARIES) + list(APPEND PCL_${COMPONENT}_LIBRARIES "${${LIB}_LIBRARIES}") + endif(${LIB}_LIBRARIES) + if(${LIB}_DEFINITIONS) + list(APPEND PCL_${COMPONENT}_DEFINITIONS ${${LIB}_DEFINITIONS}) + endif(${LIB}_DEFINITIONS) + else(${LIB}_FOUND) + if("${_is_optional}" STREQUAL "OPTIONAL") + add_definitions("-DDISABLE_${LIB}") + pcl_message("** WARNING ** ${_component} features related to ${_lib} will be disabled") + elseif("${_is_optional}" STREQUAL "REQUIRED") + if((NOT PCL_FIND_ALL) OR (PCL_FIND_ALL EQUAL 1)) + pcl_report_not_found("${_component} is required but ${_lib} was not found") + elseif(PCL_FIND_ALL EQUAL 0) + # raise error and remove _component from PCL_TO_FIND_COMPONENTS + string(TOUPPER "${_component}" COMPONENT) + pcl_message("** WARNING ** ${_component} will be disabled cause ${_lib} was not found") + list(REMOVE_ITEM PCL_TO_FIND_COMPONENTS ${_component}) + endif((NOT PCL_FIND_ALL) OR (PCL_FIND_ALL EQUAL 1)) + endif("${_is_optional}" STREQUAL "OPTIONAL") + endif(${LIB}_FOUND) +endmacro(find_external_library) + +macro(pcl_check_external_dependency _component) +endmacro(pcl_check_external_dependency) + +#flatten dependencies recursivity is great \o/ +macro(compute_dependencies TO_FIND_COMPONENTS) + foreach(component ${${TO_FIND_COMPONENTS}}) + set(pcl_component pcl_${component}) + if(${pcl_component}_int_dep AND (NOT PCL_FIND_ALL)) + foreach(dependency ${${pcl_component}_int_dep}) + list(FIND ${TO_FIND_COMPONENTS} ${component} pos) + list(FIND ${TO_FIND_COMPONENTS} ${dependency} found) + if(found EQUAL -1) + set(pcl_dependency pcl_${dependency}) + if(${pcl_dependency}_int_dep) + list(INSERT ${TO_FIND_COMPONENTS} ${pos} ${dependency}) + if(pcl_${dependency}_ext_dep) + list(APPEND pcl_${component}_ext_dep ${pcl_${dependency}_ext_dep}) + endif(pcl_${dependency}_ext_dep) + if(pcl_${dependency}_opt_dep) + list(APPEND pcl_${component}_opt_dep ${pcl_${dependency}_opt_dep}) + endif(pcl_${dependency}_opt_dep) + compute_dependencies(${TO_FIND_COMPONENTS}) + else(${pcl_dependency}_int_dep) + list(INSERT ${TO_FIND_COMPONENTS} 0 ${dependency}) + endif(${pcl_dependency}_int_dep) + endif(found EQUAL -1) + endforeach(dependency) + endif(${pcl_component}_int_dep AND (NOT PCL_FIND_ALL)) + endforeach(component) +endmacro(compute_dependencies) + +### ---[ Find PCL + +if(PCL_FIND_QUIETLY) + set(QUIET_ QUIET) +else(PCL_FIND_QUIETLY) + set(QUIET_) +endif(PCL_FIND_QUIETLY) + +find_package(PkgConfig) + +file(TO_CMAKE_PATH "${PCL_DIR}" PCL_DIR) +if(WIN32) +# PCLConfig.cmake is installed to PCL_ROOT/cmake + get_filename_component(PCL_ROOT "${PCL_DIR}" PATH) +else(WIN32) +# PCLConfig.cmake is installed to PCL_ROOT/share/pcl-x.y + get_filename_component(PCL_ROOT "${PCL_DIR}" PATH) + get_filename_component(PCL_ROOT "${PCL_ROOT}" PATH) +endif(WIN32) + +# check whether PCLConfig.cmake is found into a PCL installation or in a build tree +if(EXISTS "${PCL_ROOT}/include/pcl-${PCL_VERSION_MAJOR}.${PCL_VERSION_MINOR}/pcl/pcl_config.h") + # Found a PCL installation + # pcl_message("Found a PCL installation") + set(PCL_INCLUDE_DIRS "${PCL_ROOT}/include/pcl-${PCL_VERSION_MAJOR}.${PCL_VERSION_MINOR}") + set(PCL_LIBRARY_DIRS "${PCL_ROOT}/@LIB_INSTALL_DIR@") + if(EXISTS "${PCL_ROOT}/3rdParty") + set(PCL_ALL_IN_ONE_INSTALLER ON) + endif(EXISTS "${PCL_ROOT}/3rdParty") +elseif(EXISTS "${PCL_DIR}/include/pcl/pcl_config.h") + # Found PCLConfig.cmake in a build tree of PCL + # pcl_message("PCL found into a build tree.") + set(PCL_INCLUDE_DIRS "${PCL_DIR}/include") # for pcl_config.h + set(PCL_LIBRARY_DIRS "${PCL_DIR}/@LIB_INSTALL_DIR@") + set(PCL_SOURCES_TREE "@CMAKE_SOURCE_DIR@") +else(EXISTS "${PCL_ROOT}/include/pcl-${PCL_VERSION_MAJOR}.${PCL_VERSION_MINOR}/pcl/pcl_config.h") + pcl_report_not_found("PCL can not be found on this machine") +endif(EXISTS "${PCL_ROOT}/include/pcl-${PCL_VERSION_MAJOR}.${PCL_VERSION_MINOR}/pcl/pcl_config.h") + +#set a suffix for debug libraries +set(PCL_DEBUG_SUFFIX "@CMAKE_DEBUG_POSTFIX@") +set(PCL_RELEASE_SUFFIX "@CMAKE_RELEASE_POSTFIX@") + +set(pcl_all_components @PCLCONFIG_AVAILABLE_COMPONENTS@ ) +list(LENGTH pcl_all_components PCL_NB_COMPONENTS) + +#list each component dependencies IN PCL +@PCLCONFIG_INTERNAL_DEPENDENCIES@ + +#list each component external dependencies (ext means mandatory and opt means optional) +@PCLCONFIG_EXTERNAL_DEPENDENCIES@ + +@PCLCONFIG_OPTIONAL_DEPENDENCIES@ + +set(pcl_header_only_components geometry) + +include(FindPackageHandleStandardArgs) + +#check if user provided a list of components +#if no components at all or full list is given set PCL_FIND_ALL +if(PCL_FIND_COMPONENTS) + list(LENGTH PCL_FIND_COMPONENTS PCL_FIND_COMPONENTS_LENGTH) + if(PCL_FIND_COMPONENTS_LENGTH EQUAL PCL_NB_COMPONENTS) + set(PCL_TO_FIND_COMPONENTS ${pcl_all_components}) + set(PCL_FIND_ALL 1) + else(PCL_FIND_COMPONENTS_LENGTH EQUAL PCL_NB_COMPONENTS) + set(PCL_TO_FIND_COMPONENTS ${PCL_FIND_COMPONENTS}) + endif(PCL_FIND_COMPONENTS_LENGTH EQUAL PCL_NB_COMPONENTS) +else(PCL_FIND_COMPONENTS) + set(PCL_TO_FIND_COMPONENTS ${pcl_all_components}) + set(PCL_FIND_ALL 1) +endif(PCL_FIND_COMPONENTS) + +compute_dependencies(PCL_TO_FIND_COMPONENTS) + +# compute external dependencies per component +foreach(component ${PCL_TO_FIND_COMPONENTS}) + foreach(opt ${pcl_${component}_opt_dep}) + find_external_library(${component} ${opt} OPTIONAL) + endforeach(opt) + foreach(ext ${pcl_${component}_ext_dep}) + find_external_library(${component} ${ext} REQUIRED) + endforeach(ext) +endforeach(component) + +foreach(component ${PCL_TO_FIND_COMPONENTS}) + set(pcl_component pcl_${component}) + string(TOUPPER "${component}" COMPONENT) + + pcl_message(STATUS "looking for PCL_${COMPONENT}") + + string(REGEX REPLACE "^cuda_(.*)$" "\\1" cuda_component "${component}") + string(REGEX REPLACE "^gpu_(.*)$" "\\1" gpu_component "${component}") + + find_path(PCL_${COMPONENT}_INCLUDE_DIR + NAMES pcl/${component} + pcl/cuda/${cuda_component} pcl/cuda/${gpu_component} pcl/cuda/${component} + pcl/gpu/${cuda_component} pcl/gpu/${gpu_component} pcl/gpu/${component} + HINTS ${PCL_INCLUDE_DIRS} + "${PCL_SOURCES_TREE}" + PATH_SUFFIXES + ${component}/include + cuda/${cuda_component}/include + gpu/${gpu_component}/include + DOC "path to ${component} headers" + NO_DEFAULT_PATH) + + if(PCL_${COMPONENT}_INCLUDE_DIR) + list(APPEND PCL_${COMPONENT}_INCLUDE_DIRS "${PCL_${COMPONENT}_INCLUDE_DIR}") + else(PCL_${COMPONENT}_INCLUDE_DIR) + #pcl_message("No include directory found for pcl_${component}.") + endif(PCL_${COMPONENT}_INCLUDE_DIR) + + # Skip find_library for header only modules + list(FIND pcl_header_only_components ${component} _is_header_only) + if(_is_header_only EQUAL -1) + find_library(PCL_${COMPONENT}_LIBRARY ${pcl_component}${PCL_RELEASE_SUFFIX} + HINTS ${PCL_LIBRARY_DIRS} + DOC "path to ${pcl_component} library" + NO_DEFAULT_PATH) + get_filename_component(${component}_library_path + ${PCL_${COMPONENT}_LIBRARY} + PATH) + + find_library(PCL_${COMPONENT}_LIBRARY_DEBUG ${pcl_component}${PCL_DEBUG_SUFFIX} + HINTS ${PCL_LIBRARY_DIRS} + DOC "path to ${pcl_component} library debug" + NO_DEFAULT_PATH) + if(PCL_${COMPONENT}_LIBRARY_DEBUG) + get_filename_component(${component}_library_path_debug + ${PCL_${COMPONENT}_LIBRARY_DEBUG} + PATH) + endif(PCL_${COMPONENT}_LIBRARY_DEBUG) + + find_package_handle_standard_args(PCL_${COMPONENT} DEFAULT_MSG + PCL_${COMPONENT}_LIBRARY PCL_${COMPONENT}_INCLUDE_DIR) + else(_is_header_only EQUAL -1) + find_package_handle_standard_args(PCL_${COMPONENT} DEFAULT_MSG + PCL_${COMPONENT}_INCLUDE_DIR) + endif(_is_header_only EQUAL -1) + + if(PCL_${COMPONENT}_FOUND) + if(NOT "${PCL_${COMPONENT}_INCLUDE_DIRS}" STREQUAL "") + list(REMOVE_DUPLICATES PCL_${COMPONENT}_INCLUDE_DIRS) + endif(NOT "${PCL_${COMPONENT}_INCLUDE_DIRS}" STREQUAL "") + list(APPEND PCL_INCLUDE_DIRS ${PCL_${COMPONENT}_INCLUDE_DIRS}) + mark_as_advanced(PCL_${COMPONENT}_INCLUDE_DIRS) + if(_is_header_only EQUAL -1) + list(APPEND PCL_DEFINITIONS ${PCL_${COMPONENT}_DEFINITIONS}) + list(APPEND PCL_LIBRARY_DIRS ${component_library_path}) + if(PCL_${COMPONENT}_LIBRARY_DEBUG) + list(APPEND PCL_${COMPONENT}_LIBRARIES optimized ${PCL_${COMPONENT}_LIBRARY} debug ${PCL_${COMPONENT}_LIBRARY_DEBUG}) + list(APPEND PCL_LIBRARY_DIRS ${component_library_path_debug}) + else(PCL_${COMPONENT}_LIBRARY_DEBUG) + list(APPEND PCL_${COMPONENT}_LIBRARIES ${PCL_${COMPONENT}_LIBRARY}) + endif(PCL_${COMPONENT}_LIBRARY_DEBUG) + list(APPEND PCL_LIBRARIES ${PCL_${COMPONENT}_LIBRARIES}) + mark_as_advanced(PCL_${COMPONENT}_LIBRARY PCL_${COMPONENT}_LIBRARY_DEBUG) + endif(_is_header_only EQUAL -1) + # Append internal dependencies + foreach(int_dep ${pcl_${component}_int_dep}) + string(TOUPPER "${int_dep}" INT_DEP) + if(PCL_${INT_DEP}_FOUND) + list(APPEND PCL_${COMPONENT}_INCLUDE_DIRS ${PCL_${INT_DEP}_INCLUDE_DIRS}) + if(PCL_${INT_DEP}_LIBRARIES) + list(APPEND PCL_${COMPONENT}_LIBRARIES "${PCL_${INT_DEP}_LIBRARIES}") + endif(PCL_${INT_DEP}_LIBRARIES) + endif(PCL_${INT_DEP}_FOUND) + endforeach(int_dep) + endif(PCL_${COMPONENT}_FOUND) +endforeach(component) + +if(NOT "${PCL_INCLUDE_DIRS}" STREQUAL "") + list(REMOVE_DUPLICATES PCL_INCLUDE_DIRS) +endif(NOT "${PCL_INCLUDE_DIRS}" STREQUAL "") + +if(NOT "${PCL_LIBRARY_DIRS}" STREQUAL "") + list(REMOVE_DUPLICATES PCL_LIBRARY_DIRS) +endif(NOT "${PCL_LIBRARY_DIRS}" STREQUAL "") + +# We need to export march=native for tutorials or user code +list (APPEND PCL_DEFINITIONS "@SSE_FLAGS@") + +if(NOT "${PCL_DEFINITIONS}" STREQUAL "") + list(REMOVE_DUPLICATES PCL_DEFINITIONS) +endif(NOT "${PCL_DEFINITIONS}" STREQUAL "") + +pcl_remove_duplicate_libraries(PCL_LIBRARIES PCL_DEDUP_LIBRARIES) +set(PCL_LIBRARIES ${PCL_DEDUP_LIBRARIES}) + +find_package_handle_standard_args(PCL DEFAULT_MSG PCL_LIBRARIES PCL_INCLUDE_DIRS) +mark_as_advanced(PCL_LIBRARIES PCL_INCLUDE_DIRS PCL_LIBRARY_DIRS) diff --git a/PCLConfigVersion.cmake.in b/PCLConfigVersion.cmake.in new file mode 100644 index 00000000..ecb80f55 --- /dev/null +++ b/PCLConfigVersion.cmake.in @@ -0,0 +1,13 @@ +# Check whether the requested PACKAGE_FIND_VERSION is compatible + +set(PACKAGE_VERSION @PCL_VERSION@) + +# Check whether the requested PACKAGE_FIND_VERSION is compatible +if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() \ No newline at end of file diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt new file mode 100644 index 00000000..0160301f --- /dev/null +++ b/apps/CMakeLists.txt @@ -0,0 +1,164 @@ +set(SUBSYS_NAME apps) +set(SUBSYS_DESC "Application examples/samples that show how PCL works") +set(SUBSYS_DEPS common io filters sample_consensus segmentation visualization kdtree features surface octree registration keypoints tracking search geometry) + +# Find VTK +if(NOT VTK_FOUND) + set(DEFAULT FALSE) + set(REASON "VTK was not found.") +else(NOT VTK_FOUND) + set(DEFAULT TRUE) + set(REASON) + include (${VTK_USE_FILE}) +endif(NOT VTK_FOUND) + +# OpenNI found? +if(NOT OPENNI_FOUND) + set(DEFAULT FALSE) + set(REASON "OpenNI was not found.") +else(NOT OPENNI_FOUND) + set(DEFAULT TRUE) + set(REASON) +endif(NOT OPENNI_FOUND) + +PCL_SUBSYS_OPTION(build ${SUBSYS_NAME} ${SUBSYS_DESC} ${DEFAULT} ${REASON}) +PCL_SUBSYS_DEPEND(build ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS openni vtk) + +if(build) + + include_directories (${CMAKE_CURRENT_BINARY_DIR}) + include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include) + + PCL_ADD_EXECUTABLE(pcl_test_search_speed ${SUBSYS_NAME} src/test_search.cpp) + target_link_libraries(pcl_test_search_speed pcl_common pcl_io pcl_search pcl_kdtree pcl_visualization) + + PCL_ADD_EXECUTABLE(pcl_nn_classification_example ${SUBSYS_NAME} src/nn_classification_example.cpp) + target_link_libraries(pcl_nn_classification_example pcl_common pcl_io pcl_features pcl_kdtree) + + PCL_ADD_EXECUTABLE(pcl_pyramid_surface_matching ${SUBSYS_NAME} src/pyramid_surface_matching.cpp) + target_link_libraries(pcl_pyramid_surface_matching pcl_common pcl_io pcl_features pcl_registration pcl_filters) + + PCL_ADD_EXECUTABLE(pcl_statistical_multiscale_interest_region_extraction_example ${SUBSYS_NAME} src/statistical_multiscale_interest_region_extraction_example.cpp) + target_link_libraries(pcl_statistical_multiscale_interest_region_extraction_example pcl_common pcl_io pcl_features pcl_filters) + + if (VTK_FOUND) + PCL_ADD_EXECUTABLE(pcl_ppf_object_recognition ${SUBSYS_NAME} src/ppf_object_recognition.cpp) + target_link_libraries(pcl_ppf_object_recognition pcl_common pcl_io pcl_filters pcl_features pcl_registration pcl_visualization pcl_sample_consensus pcl_segmentation) + + PCL_ADD_EXECUTABLE(pcl_multiscale_feature_persistence_example ${SUBSYS_NAME} src/multiscale_feature_persistence_example.cpp) + target_link_libraries(pcl_multiscale_feature_persistence_example pcl_common pcl_io pcl_filters pcl_features pcl_visualization) + + PCL_ADD_EXECUTABLE(pcl_surfel_smoothing_test ${SUBSYS_NAME} src/surfel_smoothing_test.cpp) + target_link_libraries(pcl_surfel_smoothing_test pcl_common pcl_io pcl_surface pcl_filters pcl_features pcl_visualization) + + PCL_ADD_EXECUTABLE(pcl_feature_matching ${SUBSYS_NAME} src/feature_matching.cpp) + target_link_libraries(pcl_feature_matching pcl_common pcl_io pcl_registration pcl_keypoints pcl_sample_consensus pcl_visualization pcl_search pcl_features pcl_kdtree pcl_surface pcl_segmentation) + + PCL_ADD_EXECUTABLE(pcl_pcd_organized_multi_plane_segmentation ${SUBSYS_NAME} src/pcd_organized_multi_plane_segmentation.cpp) + target_link_libraries(pcl_pcd_organized_multi_plane_segmentation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_features) + +# PCL_ADD_EXECUTABLE(pcl_convolve ${SUBSYS_NAME} src/convolve.cpp) +# target_link_libraries(pcl_convolve pcl_common pcl_io pcl_visualization) + + if (OPENNI_FOUND AND BUILD_OPENNI) + PCL_ADD_EXECUTABLE(openni_fast_mesh ${SUBSYS_NAME} src/openni_fast_mesh.cpp) + target_link_libraries(openni_fast_mesh pcl_common pcl_io pcl_visualization pcl_surface) + + PCL_ADD_EXECUTABLE(openni_voxel_grid ${SUBSYS_NAME} src/openni_voxel_grid.cpp) + target_link_libraries(openni_voxel_grid pcl_common pcl_io pcl_filters pcl_visualization) + + PCL_ADD_EXECUTABLE(pcl_openni_grab_frame ${SUBSYS_NAME} src/openni_grab_frame.cpp) + target_link_libraries(pcl_openni_grab_frame pcl_common pcl_io pcl_visualization) + + PCL_ADD_EXECUTABLE(pcl_openni_fast_mesh ${SUBSYS_NAME} src/openni_fast_mesh.cpp) + target_link_libraries(pcl_openni_fast_mesh pcl_common pcl_io pcl_visualization pcl_surface) + + PCL_ADD_EXECUTABLE(pcl_openni_voxel_grid ${SUBSYS_NAME} src/openni_voxel_grid.cpp) + target_link_libraries(pcl_openni_voxel_grid pcl_common pcl_io pcl_filters pcl_visualization) + + PCL_ADD_EXECUTABLE(pcl_openni_stream_compression ${SUBSYS_NAME} src/openni_stream_compression.cpp) + target_link_libraries(pcl_openni_stream_compression pcl_common pcl_io pcl_filters pcl_visualization pcl_octree) + + PCL_ADD_EXECUTABLE(openni_ii_normal_estimation ${SUBSYS_NAME} src/openni_ii_normal_estimation.cpp) + target_link_libraries(openni_ii_normal_estimation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface) + + PCL_ADD_EXECUTABLE(pcl_openni_planar_segmentation ${SUBSYS_NAME} src/openni_planar_segmentation.cpp) + target_link_libraries(pcl_openni_planar_segmentation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus) + + PCL_ADD_EXECUTABLE(pcl_openni_floodfill_planar_segmentation ${SUBSYS_NAME} src/openni_floodfill_planar_segmentation.cpp) + target_link_libraries(pcl_openni_floodfill_planar_segmentation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_features) + + PCL_ADD_EXECUTABLE(pcl_openni_organized_multi_plane_segmentation ${SUBSYS_NAME} src/openni_organized_multi_plane_segmentation.cpp) + target_link_libraries(pcl_openni_organized_multi_plane_segmentation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_features) + + PCL_ADD_EXECUTABLE(pcl_openni_ii_normal_estimation ${SUBSYS_NAME} src/openni_ii_normal_estimation.cpp) + target_link_libraries(pcl_openni_ii_normal_estimation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface) + + PCL_ADD_EXECUTABLE(pcl_openni_feature_persistence ${SUBSYS_NAME} src/openni_feature_persistence.cpp) + target_link_libraries(pcl_openni_feature_persistence pcl_common pcl_io pcl_filters pcl_visualization pcl_features) + + PCL_ADD_EXECUTABLE(pcl_openni_mls_smoothing ${SUBSYS_NAME} src/openni_mls_smoothing.cpp) + target_link_libraries(pcl_openni_mls_smoothing pcl_common pcl_io pcl_surface pcl_visualization) + + PCL_ADD_EXECUTABLE(pcl_openni_change_viewer ${SUBSYS_NAME} src/openni_change_viewer.cpp) + target_link_libraries(pcl_openni_change_viewer pcl_common pcl_io pcl_kdtree pcl_octree pcl_visualization pcl_filters) + + PCL_ADD_EXECUTABLE(pcl_openni_uniform_sampling ${SUBSYS_NAME} src/openni_uniform_sampling.cpp) + target_link_libraries(pcl_openni_uniform_sampling pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface pcl_keypoints) + + PCL_ADD_EXECUTABLE(pcl_openni_boundary_estimation ${SUBSYS_NAME} src/openni_boundary_estimation.cpp) + target_link_libraries(pcl_openni_boundary_estimation pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface) + + if (QT4_FOUND AND VTK_USE_QVTK) + # OpenNI Passthrough application demo + QT4_WRAP_UI(openni_passthrough_ui src/openni_passthrough.ui) + QT4_WRAP_CPP(openni_passthrough_moc include/pcl/apps/openni_passthrough.h) + PCL_ADD_EXECUTABLE(pcl_openni_passthrough ${SUBSYS_NAME} ${openni_passthrough_ui} ${openni_passthrough_moc} src/openni_passthrough.cpp) + target_link_libraries(pcl_openni_passthrough pcl_common pcl_io pcl_filters pcl_visualization QVTK ${QT_LIBRARIES}) + + # OpenNI Organized Connected Component application demo + QT4_WRAP_UI(organized_segmentation_demo_ui src/organized_segmentation_demo.ui) + QT4_WRAP_CPP(organized_segmentation_demo_moc include/pcl/apps/organized_segmentation_demo.h) + PCL_ADD_EXECUTABLE(pcl_organized_segmentation_demo ${SUBSYS_NAME} ${organized_segmentation_demo_ui} ${organized_segmentation_demo_moc} src/organized_segmentation_demo.cpp) + target_link_libraries(pcl_organized_segmentation_demo pcl_common pcl_io pcl_visualization pcl_segmentation pcl_features pcl_surface QVTK ${QT_LIBRARIES}) + endif () + + set(incs + include/pcl/${SUBSYS_NAME}/render_views_tesselated_sphere.h + include/pcl/${SUBSYS_NAME}/timer.h) + set(srcs src/render_views_tesselated_sphere.cpp) + + if (QHULL_FOUND) + PCL_ADD_EXECUTABLE(pcl_openni_3d_convex_hull ${SUBSYS_NAME} src/openni_3d_convex_hull.cpp) + target_link_libraries(pcl_openni_3d_convex_hull pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface) + + PCL_ADD_EXECUTABLE(pcl_openni_3d_concave_hull ${SUBSYS_NAME} src/openni_3d_concave_hull.cpp) + target_link_libraries(pcl_openni_3d_concave_hull pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_features pcl_surface) + + PCL_ADD_EXECUTABLE(pcl_openni_tracking ${SUBSYS_NAME} src/openni_tracking.cpp) + target_link_libraries(pcl_openni_tracking pcl_common pcl_io pcl_surface pcl_visualization pcl_filters pcl_features pcl_segmentation pcl_tracking pcl_search) + + set(incs include/pcl/${SUBSYS_NAME}/dominant_plane_segmentation.h ${incs}) + set(impl_incs include/pcl/${SUBSYS_NAME}/impl/dominant_plane_segmentation.hpp) + set(srcs src/dominant_plane_segmentation.cpp ${srcs}) + + PCL_ADD_EXECUTABLE(pcl_openni_planar_convex_hull ${SUBSYS_NAME} src/openni_planar_convex_hull.cpp) + target_link_libraries(pcl_openni_planar_convex_hull pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_sample_consensus pcl_surface) + + endif() # QHULL_FOUND + + # Install include files + PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME} ${incs}) + PCL_ADD_INCLUDES(${SUBSYS_NAME} ${SUBSYS_NAME}/impl ${impl_incs}) + + set(LIB_NAME pcl_${SUBSYS_NAME}) + PCL_ADD_LIBRARY(${LIB_NAME} ${SUBSYS_NAME} ${srcs} ${impl_incs} ${incs}) + target_link_libraries(${LIB_NAME} pcl_common pcl_io pcl_filters pcl_visualization pcl_segmentation pcl_surface pcl_features pcl_sample_consensus pcl_search) + + PCL_MAKE_PKGCONFIG(${LIB_NAME} ${SUBSYS_NAME} "${SUBSYS_DESC}" "" "" "" "" "") + + endif() # OPENNI_FOUND + BUILD_OPENNI + + endif() # VTK_FOUND + +endif(build) diff --git a/apps/include/pcl/apps/dominant_plane_segmentation.h b/apps/include/pcl/apps/dominant_plane_segmentation.h new file mode 100644 index 00000000..6f601370 --- /dev/null +++ b/apps/include/pcl/apps/dominant_plane_segmentation.h @@ -0,0 +1,286 @@ +/* + * Software License Agreement (BSD License) + * + * Copyright (c) 2010, Willow Garage, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef DOMINANT_PLANE_SEGMENTATION_H_ +#define DOMINANT_PLANE_SEGMENTATION_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + namespace apps + { + /** \brief @b DominantPlaneSegmentation performs euclidean segmentation on a scene assuming that a dominant plane exists. + * \author Aitor Aldoma + * \ingroup apps + */ + + template + class PCL_EXPORTS DominantPlaneSegmentation + { + public: + typedef pcl::PointCloud Cloud; + typedef typename Cloud::Ptr CloudPtr; + typedef typename Cloud::ConstPtr CloudConstPtr; + typedef typename pcl::search::KdTree::Ptr KdTreePtr; + + DominantPlaneSegmentation () + { + min_z_bounds_ = 0; + max_z_bounds_ = 1.5; + object_min_height_ = 0.01; + object_max_height_ = 0.7; + object_cluster_tolerance_ = 0.05f; + object_cluster_min_size_ = 500; + k_ = 50; + sac_distance_threshold_ = 0.01; + downsample_leaf_ = 0.005f; + wsize_ = 5; + } + + /* \brief Extract the clusters. + * \param clusters Clusters extracted from the initial point cloud at the resolution size + * specified by downsample_leaf_ + */ + void + compute (std::vector & clusters); + + /* \brief Extract the clusters. + * \param clusters Clusters extracted from the initial point cloud. The returned + * clusters are not downsampled. + */ + void + compute_full (std::vector & clusters); + + /* \brief Extract clusters on a plane using connected components on an organized pointcloud. + * The method expects a the input cloud to have the is_dense attribute set to false. + * \param clusters Clusters extracted from the initial point cloud. The returned + * clusters are not downsampled. + */ + void + compute_fast (std::vector & clusters); + + /* \brief Computes the table plane. + */ + void + compute_table_plane(); + + /* \brief Sets the input point cloud. + * \param cloud_in The input point cloud. + */ + void + setInputCloud (CloudPtr & cloud_in) + { + input_ = cloud_in; + } + + /* \brief Returns the table coefficients after computation + * \param model represents the normal and the position of the plane (a,b,c,d) + */ + void + getTableCoefficients (Eigen::Vector4f & model) + { + model = table_coeffs_; + } + + /* \brief Sets minimum distance between clusters + * \param d distance (in meters) + */ + void + setDistanceBetweenClusters (float d) + { + object_cluster_tolerance_ = d; + } + + /* \brief Sets minimum size of the clusters. + * \param size number of points + */ + void + setMinClusterSize (int size) + { + object_cluster_min_size_ = size; + } + + /* \brief Sets the min height of the clusters in order to be considered. + * \param h minimum height (in meters) + */ + void + setObjectMinHeight (double h) + { + object_min_height_ = h; + } + + /* \brief Sets the max height of the clusters in order to be considered. + * \param h max height (in meters) + */ + void + setObjectMaxHeight (double h) + { + object_max_height_ = h; + } + + /* \brief Sets minimum distance from the camera for a point to be considered. + * \param z distance (in meters) + */ + void + setMinZBounds (double z) + { + min_z_bounds_ = z; + } + /* \brief Sets maximum distance from the camera for a point to be considered. + * \param z distance (in meters) + */ + void + setMaxZBounds (double z) + { + max_z_bounds_ = z; + } + + /* \brief Sets the number of neighbors used for normal estimation. + * \param k number of neighbors + */ + void setKNeighbors(int k) { + k_ = k; + } + + /* \brief Set threshold for SAC plane segmentation + * \param d threshold (in meters) + */ + void setSACThreshold(double d) { + sac_distance_threshold_ = d; + } + + /* \brief Set downsampling resolution. + * \param d resolution (in meters) + */ + void + setDownsamplingSize (float d) + { + downsample_leaf_ = d; + } + + /* \brief Set window size in pixels for CC used in compute_fast method + * \param w window size (in pixels) + */ + void setWSize(int w) { + wsize_ = w; + } + + /* \brief Returns the indices of the clusters found by the segmentation + * NOTE: This function returns only valid indices if the compute_fast method is used + * \param indices indices of the clusters + */ + void getIndicesClusters(std::vector & indices) { + indices = indices_clusters_; + } + + private: + + int + check (pcl::PointXYZI & p1, pcl::PointXYZI & p2, float, float max_dist) + { + if (p1.intensity == 0) //new label + return 1; + else + { + //compute distance and check aginst max_dist + if ((p1.getVector3fMap () - p2.getVector3fMap ()).norm () <= max_dist) + { + p2.intensity = p1.intensity; + return 0; + } + else //new label + return 1; + } + } + + //components needed for cluster segmentation and plane extraction + pcl::PassThrough pass_; + pcl::VoxelGrid grid_; + pcl::NormalEstimation n3d_; + pcl::SACSegmentationFromNormals seg_; + pcl::ProjectInliers proj_; + pcl::ProjectInliers bb_cluster_proj_; + pcl::ConvexHull hull_; + pcl::ExtractPolygonalPrismData prism_; + pcl::EuclideanClusterExtraction cluster_; + + /** \brief Input cloud from which to extract clusters */ + CloudPtr input_; + /** \brief Table coefficients (a,b,c,d) */ + Eigen::Vector4f table_coeffs_; + /** \brief Downsampling resolution. */ + float downsample_leaf_; + /** \brief Number of neighbors for normal estimation */ + int k_; + /** \brief Keep points farther away than min_z_bounds */ + double min_z_bounds_; + /** \brief Keep points closer than max_z_bounds */ + double max_z_bounds_; + /** \brief Threshold for SAC plane segmentation */ + double sac_distance_threshold_; + /** \brief Min height from the table plane object points will be considered from */ + double object_min_height_; + /** \brief Max height from the table plane */ + double object_max_height_; + /** \brief Tolerance between different clusters */ + float object_cluster_tolerance_; + /** \brief Minimum size for a cluster, clusters smaller than this won't be returned */ + int object_cluster_min_size_; + /** \brief Window size in pixels for CC in compute_fast method */ + int wsize_; + /** \brief Indices of the clusters to the main cloud found by the segmentation */ + std::vector indices_clusters_; + + }; + } +} + +#endif /* DOMINANT_PLANE_SEGMENTATION_H_ */ diff --git a/apps/include/pcl/apps/impl/dominant_plane_segmentation.hpp b/apps/include/pcl/apps/impl/dominant_plane_segmentation.hpp new file mode 100644 index 00000000..2d11c0f0 --- /dev/null +++ b/apps/include/pcl/apps/impl/dominant_plane_segmentation.hpp @@ -0,0 +1,856 @@ +/* + * Software License Agreement (BSD License) + * + * Copyright (c) 2010, Willow Garage, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +#include + +#include +#include +#include +#include + +template void +pcl::apps::DominantPlaneSegmentation::compute_table_plane () +{ + // Has the input dataset been set already? + if (!input_) + { + PCL_WARN ("[pcl::apps::DominantPlaneSegmentation] No input dataset given!\n"); + return; + } + + CloudConstPtr cloud_; + CloudPtr cloud_filtered_ (new Cloud ()); + CloudPtr cloud_downsampled_ (new Cloud ()); + pcl::PointCloud::Ptr cloud_normals_ (new pcl::PointCloud ()); + pcl::PointIndices::Ptr table_inliers_ (new pcl::PointIndices ()); + pcl::ModelCoefficients::Ptr table_coefficients_ (new pcl::ModelCoefficients ()); + CloudPtr table_projected_ (new Cloud ()); + CloudPtr table_hull_ (new Cloud ()); + + typename pcl::search::KdTree::Ptr normals_tree_ (new pcl::search::KdTree); + + // Normal estimation parameters + n3d_.setKSearch (k_); + n3d_.setSearchMethod (normals_tree_); + + // Table model fitting parameters + seg_.setDistanceThreshold (sac_distance_threshold_); + seg_.setMaxIterations (2000); + seg_.setNormalDistanceWeight (0.1); + seg_.setOptimizeCoefficients (true); + seg_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + seg_.setMethodType (pcl::SAC_RANSAC); + seg_.setProbability (0.99); + + proj_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + bb_cluster_proj_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + + // ---[ PassThroughFilter + pass_.setFilterLimits (min_z_bounds_, max_z_bounds_); + pass_.setFilterFieldName ("z"); + pass_.setInputCloud (input_); + pass_.filter (*cloud_filtered_); + + if (int (cloud_filtered_->points.size ()) < k_) + { + PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %zu points! Aborting.", + cloud_filtered_->points.size ()); + return; + } + + // Downsample the point cloud + grid_.setLeafSize (downsample_leaf_, downsample_leaf_, downsample_leaf_); + grid_.setDownsampleAllData (false); + grid_.setInputCloud (cloud_filtered_); + grid_.filter (*cloud_downsampled_); + + // ---[ Estimate the point normals + n3d_.setInputCloud (cloud_downsampled_); + n3d_.compute (*cloud_normals_); + + // ---[ Perform segmentation + seg_.setInputCloud (cloud_downsampled_); + seg_.setInputNormals (cloud_normals_); + seg_.segment (*table_inliers_, *table_coefficients_); + + if (table_inliers_->indices.size () == 0) + { + PCL_WARN ("[DominantPlaneSegmentation] No Plane Inliers points! Aborting."); + return; + } + + // ---[ Extract the plane + proj_.setInputCloud (cloud_downsampled_); + proj_.setIndices (table_inliers_); + proj_.setModelCoefficients (table_coefficients_); + proj_.filter (*table_projected_); + + // ---[ Estimate the convex hull + std::vector polygons; + CloudPtr table_hull (new Cloud ()); + hull_.setInputCloud (table_projected_); + hull_.reconstruct (*table_hull, polygons); + + // Compute the plane coefficients + Eigen::Vector4f model_coefficients; + EIGEN_ALIGN16 Eigen::Matrix3f covariance_matrix; + + model_coefficients[0] = table_coefficients_->values[0]; + model_coefficients[1] = table_coefficients_->values[1]; + model_coefficients[2] = table_coefficients_->values[2]; + model_coefficients[3] = table_coefficients_->values[3]; + + // Need to flip the plane normal towards the viewpoint + Eigen::Vector4f vp (0, 0, 0, 0); + // See if we need to flip any plane normals + vp -= table_hull->points[0].getVector4fMap (); + vp[3] = 0; + // Dot product between the (viewpoint - point) and the plane normal + float cos_theta = vp.dot (model_coefficients); + // Flip the plane normal + if (cos_theta < 0) + { + model_coefficients *= -1; + model_coefficients[3] = 0; + // Hessian form (D = nc . p_plane (centroid here) + p) + model_coefficients[3] = -1 * (model_coefficients.dot (table_hull->points[0].getVector4fMap ())); + } + + //Set table_coeffs + table_coeffs_ = model_coefficients; +} + +template void +pcl::apps::DominantPlaneSegmentation::compute_fast (std::vector & clusters) +{ + // Has the input dataset been set already? + if (!input_) + { + PCL_WARN ("[pcl::apps::DominantPlaneSegmentation] No input dataset given!\n"); + return; + } + + // Is the input dataset organized? + if (input_->is_dense) + { + PCL_WARN ("[pcl::apps::DominantPlaneSegmentation] compute_fast can only be used with organized point clouds!\n"); + return; + } + + CloudConstPtr cloud_; + CloudPtr cloud_filtered_ (new Cloud ()); + CloudPtr cloud_downsampled_ (new Cloud ()); + pcl::PointCloud::Ptr cloud_normals_ (new pcl::PointCloud ()); + pcl::PointIndices::Ptr table_inliers_ (new pcl::PointIndices ()); + pcl::ModelCoefficients::Ptr table_coefficients_ (new pcl::ModelCoefficients ()); + CloudPtr table_projected_ (new Cloud ()); + CloudPtr table_hull_ (new Cloud ()); + CloudPtr cloud_objects_ (new Cloud ()); + CloudPtr cluster_object_ (new Cloud ()); + + typename pcl::search::KdTree::Ptr normals_tree_ (new pcl::search::KdTree); + typename pcl::search::KdTree::Ptr clusters_tree_ (new pcl::search::KdTree); + clusters_tree_->setEpsilon (1); + + // Normal estimation parameters + n3d_.setKSearch (k_); + n3d_.setSearchMethod (normals_tree_); + + // Table model fitting parameters + seg_.setDistanceThreshold (sac_distance_threshold_); + seg_.setMaxIterations (2000); + seg_.setNormalDistanceWeight (0.1); + seg_.setOptimizeCoefficients (true); + seg_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + seg_.setMethodType (pcl::SAC_RANSAC); + seg_.setProbability (0.99); + + proj_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + bb_cluster_proj_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + + prism_.setHeightLimits (object_min_height_, object_max_height_); + + // Clustering parameters + cluster_.setClusterTolerance (object_cluster_tolerance_); + cluster_.setMinClusterSize (object_cluster_min_size_); + cluster_.setSearchMethod (clusters_tree_); + + // ---[ PassThroughFilter + pass_.setFilterLimits (min_z_bounds_, max_z_bounds_); + pass_.setFilterFieldName ("z"); + pass_.setInputCloud (input_); + pass_.filter (*cloud_filtered_); + + if (int (cloud_filtered_->points.size ()) < k_) + { + PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %zu points! Aborting.", + cloud_filtered_->points.size ()); + return; + } + + // Downsample the point cloud + grid_.setLeafSize (downsample_leaf_, downsample_leaf_, downsample_leaf_); + grid_.setDownsampleAllData (false); + grid_.setInputCloud (cloud_filtered_); + grid_.filter (*cloud_downsampled_); + + // ---[ Estimate the point normals + n3d_.setInputCloud (cloud_downsampled_); + n3d_.compute (*cloud_normals_); + + // ---[ Perform segmentation + seg_.setInputCloud (cloud_downsampled_); + seg_.setInputNormals (cloud_normals_); + seg_.segment (*table_inliers_, *table_coefficients_); + + if (table_inliers_->indices.size () == 0) + { + PCL_WARN ("[DominantPlaneSegmentation] No Plane Inliers points! Aborting."); + return; + } + + // ---[ Extract the plane + proj_.setInputCloud (cloud_downsampled_); + proj_.setIndices (table_inliers_); + proj_.setModelCoefficients (table_coefficients_); + proj_.filter (*table_projected_); + + // ---[ Estimate the convex hull + std::vector polygons; + CloudPtr table_hull (new Cloud ()); + hull_.setInputCloud (table_projected_); + hull_.reconstruct (*table_hull, polygons); + + // Compute the plane coefficients + Eigen::Vector4f model_coefficients; + EIGEN_ALIGN16 Eigen::Matrix3f covariance_matrix; + + model_coefficients[0] = table_coefficients_->values[0]; + model_coefficients[1] = table_coefficients_->values[1]; + model_coefficients[2] = table_coefficients_->values[2]; + model_coefficients[3] = table_coefficients_->values[3]; + + // Need to flip the plane normal towards the viewpoint + Eigen::Vector4f vp (0, 0, 0, 0); + // See if we need to flip any plane normals + vp -= table_hull->points[0].getVector4fMap (); + vp[3] = 0; + // Dot product between the (viewpoint - point) and the plane normal + float cos_theta = vp.dot (model_coefficients); + // Flip the plane normal + if (cos_theta < 0) + { + model_coefficients *= -1; + model_coefficients[3] = 0; + // Hessian form (D = nc . p_plane (centroid here) + p) + model_coefficients[3] = -1 * (model_coefficients.dot (table_hull->points[0].getVector4fMap ())); + } + + //Set table_coeffs + table_coeffs_ = model_coefficients; + + // ---[ Get the objects on top of the table + pcl::PointIndices cloud_object_indices; + prism_.setInputCloud (input_); + prism_.setInputPlanarHull (table_hull); + prism_.segment (cloud_object_indices); + + pcl::ExtractIndices extract_object_indices; + extract_object_indices.setInputCloud (input_); + extract_object_indices.setIndices (boost::make_shared (cloud_object_indices)); + extract_object_indices.filter (*cloud_objects_); + + //create new binary pointcloud with intensity values (0 and 1), 0 for non-object pixels and 1 otherwise + pcl::PointCloud::Ptr binary_cloud (new pcl::PointCloud); + + { + binary_cloud->width = input_->width; + binary_cloud->height = input_->height; + binary_cloud->points.resize (input_->points.size ()); + binary_cloud->is_dense = input_->is_dense; + + size_t idx; + for (size_t i = 0; i < cloud_object_indices.indices.size (); ++i) + { + idx = cloud_object_indices.indices[i]; + binary_cloud->points[idx].getVector4fMap () = input_->points[idx].getVector4fMap (); + binary_cloud->points[idx].intensity = 1.0; + } + } + + //connected components on the binary image + + std::map connected_labels; + float c_intensity = 0.1f; + float intensity_incr = 0.1f; + + { + + int wsize = wsize_; + for (int i = 0; i < int (binary_cloud->width); i++) + { + for (int j = 0; j < int (binary_cloud->height); j++) + { + if (binary_cloud->at (i, j).intensity != 0) + { + //check neighboring pixels, first left and then top + //be aware of margins + + if ((i - 1) < 0 && (j - 1) < 0) + { + //top-left pixel + (*binary_cloud) (i, j).intensity = c_intensity; + } + else + { + if ((j - 1) < 0) + { + //top-row, check on the left of pixel to assign a new label or not + int left = check ((*binary_cloud) (i - 1, j), (*binary_cloud) (i, j), c_intensity, object_cluster_tolerance_); + if (left) + { + //Nothing found on the left, check bigger window + + bool found = false; + for (int kk = 2; kk < wsize && !found; kk++) + { + if ((i - kk) < 0) + continue; + + int left = check ((*binary_cloud) (i - kk, j), (*binary_cloud) (i, j), c_intensity, object_cluster_tolerance_); + if (left == 0) + { + found = true; + } + } + + if (!found) + { + c_intensity += intensity_incr; + (*binary_cloud) (i, j).intensity = c_intensity; + } + + } + } + else + { + if ((i - 1) == 0) + { + //check only top + int top = check ((*binary_cloud) (i, j - 1), (*binary_cloud) (i, j), c_intensity, object_cluster_tolerance_); + if (top) + { + bool found = false; + for (int kk = 2; kk < wsize && !found; kk++) + { + if ((j - kk) < 0) + continue; + + int top = check ((*binary_cloud) (i, j - kk), (*binary_cloud) (i, j), c_intensity, object_cluster_tolerance_); + if (top == 0) + { + found = true; + } + } + + if (!found) + { + c_intensity += intensity_incr; + (*binary_cloud) (i, j).intensity = c_intensity; + } + } + + } + else + { + //check left and top + int left = check ((*binary_cloud) (i - 1, j), (*binary_cloud) (i, j), c_intensity, object_cluster_tolerance_); + int top = check ((*binary_cloud) (i, j - 1), (*binary_cloud) (i, j), c_intensity, object_cluster_tolerance_); + + if (left == 0 && top == 0) + { + //both top and left had labels, check if they are different + //if they are, take the smallest one and mark labels to be connected.. + + if ((*binary_cloud) (i - 1, j).intensity != (*binary_cloud) (i, j - 1).intensity) + { + float smaller_intensity = (*binary_cloud) (i - 1, j).intensity; + float bigger_intensity = (*binary_cloud) (i, j - 1).intensity; + + if ((*binary_cloud) (i - 1, j).intensity > (*binary_cloud) (i, j - 1).intensity) + { + smaller_intensity = (*binary_cloud) (i, j - 1).intensity; + bigger_intensity = (*binary_cloud) (i - 1, j).intensity; + } + + connected_labels[bigger_intensity] = smaller_intensity; + (*binary_cloud) (i, j).intensity = smaller_intensity; + } + } + + if (left == 1 && top == 1) + { + //if none had labels, increment c_intensity + //search first on bigger window + bool found = false; + for (int dist = 2; dist < wsize && !found; dist++) + { + if (((i - dist) < 0) || ((j - dist) < 0)) + continue; + + int left = check ((*binary_cloud) (i - dist, j), (*binary_cloud) (i, j), c_intensity, object_cluster_tolerance_); + int top = check ((*binary_cloud) (i, j - dist), (*binary_cloud) (i, j), c_intensity, object_cluster_tolerance_); + + if (left == 0 && top == 0) + { + if ((*binary_cloud) (i - dist, j).intensity != (*binary_cloud) (i, j - dist).intensity) + { + float smaller_intensity = (*binary_cloud) (i - dist, j).intensity; + float bigger_intensity = (*binary_cloud) (i, j - dist).intensity; + + if ((*binary_cloud) (i - dist, j).intensity > (*binary_cloud) (i, j - dist).intensity) + { + smaller_intensity = (*binary_cloud) (i, j - dist).intensity; + bigger_intensity = (*binary_cloud) (i - dist, j).intensity; + } + + connected_labels[bigger_intensity] = smaller_intensity; + (*binary_cloud) (i, j).intensity = smaller_intensity; + found = true; + } + } + else if (left == 0 || top == 0) + { + //one had label + found = true; + } + } + + if (!found) + { + //none had label in the bigger window + c_intensity += intensity_incr; + (*binary_cloud) (i, j).intensity = c_intensity; + } + } + } + } + } + + } + } + } + } + + std::map clusters_map; + + { + std::map::iterator it; + + for (int i = 0; i < int (binary_cloud->width); i++) + { + for (int j = 0; j < int (binary_cloud->height); j++) + { + if (binary_cloud->at (i, j).intensity != 0) + { + //check if this is a root label... + it = connected_labels.find (binary_cloud->at (i, j).intensity); + while (it != connected_labels.end ()) + { + //the label is on the list, change pixel intensity until it has a root label + (*binary_cloud) (i, j).intensity = (*it).second; + it = connected_labels.find (binary_cloud->at (i, j).intensity); + } + + std::map::iterator it_indices; + it_indices = clusters_map.find (binary_cloud->at (i, j).intensity); + if (it_indices == clusters_map.end ()) + { + pcl::PointIndices indices; + clusters_map[binary_cloud->at (i, j).intensity] = indices; + } + + clusters_map[binary_cloud->at (i, j).intensity].indices.push_back (static_cast (j * binary_cloud->width + i)); + } + } + } + } + + clusters.resize (clusters_map.size ()); + + std::map::iterator it_indices; + int k = 0; + for (it_indices = clusters_map.begin (); it_indices != clusters_map.end (); it_indices++) + { + + if (int ((*it_indices).second.indices.size ()) >= object_cluster_min_size_) + { + + clusters[k] = CloudPtr (new Cloud ()); + pcl::copyPointCloud (*input_, (*it_indices).second.indices, *clusters[k]); + k++; + indices_clusters_.push_back((*it_indices).second); + } + } + + clusters.resize (k); + +} + +template void +pcl::apps::DominantPlaneSegmentation::compute (std::vector & clusters) +{ + + // Has the input dataset been set already? + if (!input_) + { + PCL_WARN ("[pcl::apps::DominantPlaneSegmentation] No input dataset given!\n"); + return; + } + + CloudConstPtr cloud_; + CloudPtr cloud_filtered_ (new Cloud ()); + CloudPtr cloud_downsampled_ (new Cloud ()); + pcl::PointCloud::Ptr cloud_normals_ (new pcl::PointCloud ()); + pcl::PointIndices::Ptr table_inliers_ (new pcl::PointIndices ()); + pcl::ModelCoefficients::Ptr table_coefficients_ (new pcl::ModelCoefficients ()); + CloudPtr table_projected_ (new Cloud ()); + CloudPtr table_hull_ (new Cloud ()); + CloudPtr cloud_objects_ (new Cloud ()); + CloudPtr cluster_object_ (new Cloud ()); + + typename pcl::search::KdTree::Ptr normals_tree_ (new pcl::search::KdTree); + typename pcl::search::KdTree::Ptr clusters_tree_ (new pcl::search::KdTree); + clusters_tree_->setEpsilon (1); + + // Normal estimation parameters + n3d_.setKSearch (k_); + n3d_.setSearchMethod (normals_tree_); + + // Table model fitting parameters + seg_.setDistanceThreshold (sac_distance_threshold_); + seg_.setMaxIterations (2000); + seg_.setNormalDistanceWeight (0.1); + seg_.setOptimizeCoefficients (true); + seg_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + seg_.setMethodType (pcl::SAC_RANSAC); + seg_.setProbability (0.99); + + proj_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + bb_cluster_proj_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + + prism_.setHeightLimits (object_min_height_, object_max_height_); + + // Clustering parameters + cluster_.setClusterTolerance (object_cluster_tolerance_); + cluster_.setMinClusterSize (object_cluster_min_size_); + cluster_.setSearchMethod (clusters_tree_); + + // ---[ PassThroughFilter + pass_.setFilterLimits (min_z_bounds_, max_z_bounds_); + pass_.setFilterFieldName ("z"); + pass_.setInputCloud (input_); + pass_.filter (*cloud_filtered_); + + if (int (cloud_filtered_->points.size ()) < k_) + { + PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %zu points! Aborting.", + cloud_filtered_->points.size ()); + return; + } + + // Downsample the point cloud + grid_.setLeafSize (downsample_leaf_, downsample_leaf_, downsample_leaf_); + grid_.setDownsampleAllData (false); + grid_.setInputCloud (cloud_filtered_); + grid_.filter (*cloud_downsampled_); + + PCL_INFO ("[DominantPlaneSegmentation] Number of points left after filtering (%f -> %f): %zu out of %zu\n", + min_z_bounds_, max_z_bounds_, cloud_downsampled_->points.size (), input_->points.size ()); + + // ---[ Estimate the point normals + n3d_.setInputCloud (cloud_downsampled_); + n3d_.compute (*cloud_normals_); + + PCL_INFO ("[DominantPlaneSegmentation] %zu normals estimated. \n", cloud_normals_->points.size ()); + + // ---[ Perform segmentation + seg_.setInputCloud (cloud_downsampled_); + seg_.setInputNormals (cloud_normals_); + seg_.segment (*table_inliers_, *table_coefficients_); + + if (table_inliers_->indices.size () == 0) + { + PCL_WARN ("[DominantPlaneSegmentation] No Plane Inliers points! Aborting."); + return; + } + + // ---[ Extract the plane + proj_.setInputCloud (cloud_downsampled_); + proj_.setIndices (table_inliers_); + proj_.setModelCoefficients (table_coefficients_); + proj_.filter (*table_projected_); + + // ---[ Estimate the convex hull + std::vector polygons; + CloudPtr table_hull (new Cloud ()); + hull_.setInputCloud (table_projected_); + hull_.reconstruct (*table_hull, polygons); + + // Compute the plane coefficients + Eigen::Vector4f model_coefficients; + EIGEN_ALIGN16 Eigen::Matrix3f covariance_matrix; + + model_coefficients[0] = table_coefficients_->values[0]; + model_coefficients[1] = table_coefficients_->values[1]; + model_coefficients[2] = table_coefficients_->values[2]; + model_coefficients[3] = table_coefficients_->values[3]; + + // Need to flip the plane normal towards the viewpoint + Eigen::Vector4f vp (0, 0, 0, 0); + // See if we need to flip any plane normals + vp -= table_hull->points[0].getVector4fMap (); + vp[3] = 0; + // Dot product between the (viewpoint - point) and the plane normal + float cos_theta = vp.dot (model_coefficients); + // Flip the plane normal + if (cos_theta < 0) + { + model_coefficients *= -1; + model_coefficients[3] = 0; + // Hessian form (D = nc . p_plane (centroid here) + p) + model_coefficients[3] = -1 * (model_coefficients.dot (table_hull->points[0].getVector4fMap ())); + } + + //Set table_coeffs + table_coeffs_ = model_coefficients; + + // ---[ Get the objects on top of the table + pcl::PointIndices cloud_object_indices; + prism_.setInputCloud (cloud_downsampled_); + prism_.setInputPlanarHull (table_hull); + prism_.segment (cloud_object_indices); + + pcl::ExtractIndices extract_object_indices; + extract_object_indices.setInputCloud (cloud_downsampled_); + extract_object_indices.setIndices (boost::make_shared (cloud_object_indices)); + extract_object_indices.filter (*cloud_objects_); + + if (cloud_objects_->points.size () == 0) + return; + + //down_.reset(new Cloud(*cloud_downsampled_)); + + // ---[ Split the objects into Euclidean clusters + std::vector clusters2; + cluster_.setInputCloud (cloud_downsampled_); + cluster_.setIndices (boost::make_shared (cloud_object_indices)); + cluster_.extract (clusters2); + + PCL_INFO ("[DominantPlaneSegmentation::compute()] Number of clusters found matching the given constraints: %zu.\n", + clusters2.size ()); + + clusters.resize (clusters2.size ()); + + for (size_t i = 0; i < clusters2.size (); ++i) + { + clusters[i] = CloudPtr (new Cloud ()); + pcl::copyPointCloud (*cloud_downsampled_, clusters2[i].indices, *clusters[i]); + } +} + +template +void +pcl::apps::DominantPlaneSegmentation::compute_full (std::vector & clusters) +{ + + // Has the input dataset been set already? + if (!input_) + { + PCL_WARN ("[pcl::apps::DominantPlaneSegmentation] No input dataset given!\n"); + return; + } + + CloudConstPtr cloud_; + CloudPtr cloud_filtered_ (new Cloud ()); + CloudPtr cloud_downsampled_ (new Cloud ()); + pcl::PointCloud::Ptr cloud_normals_ (new pcl::PointCloud ()); + pcl::PointIndices::Ptr table_inliers_ (new pcl::PointIndices ()); + pcl::ModelCoefficients::Ptr table_coefficients_ (new pcl::ModelCoefficients ()); + CloudPtr table_projected_ (new Cloud ()); + CloudPtr table_hull_ (new Cloud ()); + CloudPtr cloud_objects_ (new Cloud ()); + CloudPtr cluster_object_ (new Cloud ()); + + typename pcl::search::KdTree::Ptr normals_tree_ (new pcl::search::KdTree); + typename pcl::search::KdTree::Ptr clusters_tree_ (new pcl::search::KdTree); + clusters_tree_->setEpsilon (1); + + // Normal estimation parameters + n3d_.setKSearch (10); + n3d_.setSearchMethod (normals_tree_); + + // Table model fitting parameters + seg_.setDistanceThreshold (sac_distance_threshold_); + seg_.setMaxIterations (2000); + seg_.setNormalDistanceWeight (0.1); + seg_.setOptimizeCoefficients (true); + seg_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + seg_.setMethodType (pcl::SAC_MSAC); + seg_.setProbability (0.98); + + proj_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + bb_cluster_proj_.setModelType (pcl::SACMODEL_NORMAL_PLANE); + + prism_.setHeightLimits (object_min_height_, object_max_height_); + + // Clustering parameters + cluster_.setClusterTolerance (object_cluster_tolerance_); + cluster_.setMinClusterSize (object_cluster_min_size_); + cluster_.setSearchMethod (clusters_tree_); + + // ---[ PassThroughFilter + pass_.setFilterLimits (min_z_bounds_, max_z_bounds_); + pass_.setFilterFieldName ("z"); + pass_.setInputCloud (input_); + pass_.filter (*cloud_filtered_); + + if (int (cloud_filtered_->points.size ()) < k_) + { + PCL_WARN ("[DominantPlaneSegmentation] Filtering returned %zu points! Aborting.", + cloud_filtered_->points.size ()); + return; + } + + // Downsample the point cloud + grid_.setLeafSize (downsample_leaf_, downsample_leaf_, downsample_leaf_); + grid_.setDownsampleAllData (false); + grid_.setInputCloud (cloud_filtered_); + grid_.filter (*cloud_downsampled_); + + PCL_INFO ("[DominantPlaneSegmentation] Number of points left after filtering&downsampling (%f -> %f): %zu out of %zu\n", + min_z_bounds_, max_z_bounds_, cloud_downsampled_->points.size (), input_->points.size ()); + + // ---[ Estimate the point normals + n3d_.setInputCloud (cloud_downsampled_); + n3d_.compute (*cloud_normals_); + + PCL_INFO ("[DominantPlaneSegmentation] %zu normals estimated. \n", cloud_normals_->points.size ()); + + // ---[ Perform segmentation + seg_.setInputCloud (cloud_downsampled_); + seg_.setInputNormals (cloud_normals_); + seg_.segment (*table_inliers_, *table_coefficients_); + + if (table_inliers_->indices.size () == 0) + { + PCL_WARN ("[DominantPlaneSegmentation] No Plane Inliers points! Aborting."); + return; + } + + // ---[ Extract the plane + proj_.setInputCloud (cloud_downsampled_); + proj_.setIndices (table_inliers_); + proj_.setModelCoefficients (table_coefficients_); + proj_.filter (*table_projected_); + + // ---[ Estimate the convex hull + std::vector polygons; + CloudPtr table_hull (new Cloud ()); + hull_.setInputCloud (table_projected_); + hull_.reconstruct (*table_hull, polygons); + + // Compute the plane coefficients + Eigen::Vector4f model_coefficients; + EIGEN_ALIGN16 Eigen::Matrix3f covariance_matrix; + + model_coefficients[0] = table_coefficients_->values[0]; + model_coefficients[1] = table_coefficients_->values[1]; + model_coefficients[2] = table_coefficients_->values[2]; + model_coefficients[3] = table_coefficients_->values[3]; + + // Need to flip the plane normal towards the viewpoint + Eigen::Vector4f vp (0, 0, 0, 0); + // See if we need to flip any plane normals + vp -= table_hull->points[0].getVector4fMap (); + vp[3] = 0; + // Dot product between the (viewpoint - point) and the plane normal + float cos_theta = vp.dot (model_coefficients); + // Flip the plane normal + if (cos_theta < 0) + { + model_coefficients *= -1; + model_coefficients[3] = 0; + // Hessian form (D = nc . p_plane (centroid here) + p) + model_coefficients[3] = -1 * (model_coefficients.dot (table_hull->points[0].getVector4fMap ())); + } + + //Set table_coeffs + table_coeffs_ = model_coefficients; + + // ---[ Get the objects on top of the table + pcl::PointIndices cloud_object_indices; + prism_.setInputCloud (cloud_filtered_); + prism_.setInputPlanarHull (table_hull); + prism_.segment (cloud_object_indices); + + pcl::ExtractIndices extract_object_indices; + extract_object_indices.setInputCloud (cloud_downsampled_); + extract_object_indices.setIndices (boost::make_shared (cloud_object_indices)); + extract_object_indices.filter (*cloud_objects_); + + if (cloud_objects_->points.size () == 0) + return; + + // ---[ Split the objects into Euclidean clusters + std::vector clusters2; + cluster_.setInputCloud (cloud_filtered_); + cluster_.setIndices (boost::make_shared (cloud_object_indices)); + cluster_.extract (clusters2); + + PCL_INFO ("[DominantPlaneSegmentation::compute_full()] Number of clusters found matching the given constraints: %zu.\n", + clusters2.size ()); + + clusters.resize (clusters2.size ()); + + for (size_t i = 0; i < clusters2.size (); ++i) + { + clusters[i] = CloudPtr (new Cloud ()); + pcl::copyPointCloud (*cloud_filtered_, clusters2[i].indices, *clusters[i]); + } +} + +#define PCL_INSTANTIATE_DominantPlaneSegmentation(T) template class PCL_EXPORTS pcl::apps::DominantPlaneSegmentation; diff --git a/apps/include/pcl/apps/nn_classification.h b/apps/include/pcl/apps/nn_classification.h new file mode 100644 index 00000000..731f7005 --- /dev/null +++ b/apps/include/pcl/apps/nn_classification.h @@ -0,0 +1,303 @@ +/* + * Software License Agreement (BSD License) + * + * Point Cloud Library (PCL) - www.pointclouds.org + * Copyright (c) 2010-2012, Willow Garage, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $Id: nn_classification.h 6218 2012-07-06 21:46:51Z aichim $ + * + */ + +#ifndef NNCLASSIFICATION_H_ +#define NNCLASSIFICATION_H_ + +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + /** + * \brief Nearest neighbor search based classification of PCL point type features. + * FLANN is used to identify a neighborhood, based on which different scoring schemes + * can be employed to obtain likelihood values for a specified list of classes. + * \author Zoltan Csaba Marton + */ + template + class NNClassification + { + private: + + typename pcl::KdTree::Ptr tree_; + + /** \brief List of class labels */ + std::vector classes_; + /** \brief The index in the class labels list for all the training examples */ + std::vector labels_idx_; + + public: + + NNClassification () : tree_ (), classes_ (), labels_idx_ () {} + + /** \brief Result is a list of class labels and scores */ + typedef std::pair, std::vector > Result; + typedef boost::shared_ptr ResultPtr; + + // TODO setIndices method, distance metrics and reset tree + + /** \brief Setting the training features. + * \param[in] features the training features + */ + void + setTrainingFeatures (const typename pcl::PointCloud::ConstPtr &features) + { + // Do not limit the number of dimensions used in the tree + typename pcl::CustomPointRepresentation::Ptr cpr (new pcl::CustomPointRepresentation (INT_MAX, 0)); + tree_.reset (new pcl::KdTreeFLANN); + tree_->setPointRepresentation (cpr); + tree_->setInputCloud (features); + } + + /** \brief Updating the labels for each training example. + * \param classes the class labels + * \param labels_idx the index in the class labels list for each training example + */ + void + setTrainingLabelIndicesAndLUT (const std::vector &classes, const std::vector &labels_idx) + { + // TODO check if min/max index is inside classes? + classes_ = classes; + labels_idx_ = labels_idx; + } + + /** \brief Setting the labels for each training example. + * The unique labels from the list are stored as the class labels, and + * for each training example an index pointing to these labels is stored. + * \note See the setTrainingLabelIndicesAndLUT method for easily re-labeling. + * \param labels the class label for each training example + */ + void + setTrainingLabels (const std::vector &labels) + { + // Create a list of unique labels + classes_ = labels; + std::sort (classes_.begin(), classes_.end()); + classes_.erase (std::unique (classes_.begin(), classes_.end()), classes_.end()); + + // Save the mapping from labels to indices in the class list + std::map label2idx; + for (std::vector::const_iterator it = classes_.begin (); it != classes_.end (); it++) + label2idx[*it] = int (it - classes_.begin ()); + + // Create a list holding the class index of each label + labels_idx_.reserve (labels.size ()); + BOOST_FOREACH (std::string s, labels) + labels_idx_.push_back (label2idx[s]); +// for (std::vector::const_iterator it = labels.begin (); it != labels.end (); it++) +// labels_idx_.push_back (label2idx[*it]); + } + + /** \brief Load the list of training examples and corresponding labels. + * \param file_name PCD file containing the training features + * \param labels_file_name the class label for each training example + * \return true on success, false on failure (read error or number of entries don't match) + */ + bool + loadTrainingFeatures(std::string file_name, std::string labels_file_name) + { + typename pcl::PointCloud::Ptr cloud (new pcl::PointCloud); + if (pcl::io::loadPCDFile (file_name.c_str (), *cloud) != 0) + return (false); + std::vector labels; + std::ifstream f (labels_file_name.c_str ()); + std::string label; + while (getline (f, label)) + if (label.size () > 0) + labels.push_back(label); + if (labels.size () != cloud->points.size ()) + return (false); + setTrainingFeatures (cloud); + setTrainingLabels (labels); + return (true); + } + + /** \brief Save the list of training examples and corresponding labels. + * \param file_name file name for writing the training features + * \param labels_file_name file name for writing the class label for each training example + * \return true on success, false on failure (write error or number of entries don't match) + */ + bool + saveTrainingFeatures (std::string file_name, std::string labels_file_name) + { + typename pcl::PointCloud::ConstPtr training_features = tree_->getInputCloud (); + if (labels_idx_.size () == training_features->points.size ()) + { + if (pcl::io::savePCDFile (file_name.c_str (), *training_features) != 0) + return (false); + std::ofstream f (labels_file_name.c_str ()); + BOOST_FOREACH (int i, labels_idx_) + f << classes_[i] << "\n"; + return (true); + } + return (false); + } + + /** \brief Utility function for the default classification process. + * \param p_q the given query point + * \param radius the radius of the sphere bounding all of p_q's neighbors + * \param gaussian_param influences the width of the Gaussian by specifying where the 36.78 score should be: score = exp(-distance/gaussian_param) + * \param max_nn if given, bounds the maximum returned neighbors to this value + * \return pair of label and score for each training class from the neighborhood + */ + ResultPtr + classify (const PointT &p_q, double radius, float gaussian_param, int max_nn = INT_MAX) + { + std::vector k_indices; + std::vector k_sqr_distances; + getSimilarExemplars (p_q, radius, k_indices, k_sqr_distances, max_nn); + return (getGaussianBestScores (gaussian_param, k_indices, k_sqr_distances)); + } + + /** \brief Search for k-nearest neighbors for the given query point. + * \param p_q the given query point + * \param k the number of neighbors to search for + * \param k_indices the resultant indices of the neighboring points (does not have to be resized to \a k a priori!) + * \param k_sqr_distances the resultant squared distances to the neighboring points (does not have be resized to \a k + * a priori!) + * \return number of neighbors found + */ + int + getKNearestExemplars (const PointT &p_q, int k, std::vector &k_indices, std::vector &k_sqr_distances) + { + k_indices.resize (k); + k_sqr_distances.resize (k); + return (tree_->nearestKSearch (p_q, k, k_indices, k_sqr_distances)); + } + + /** \brief Search for all the nearest neighbors of the query point in a given radius. + * \param p_q the given query point + * \param radius the radius of the sphere bounding all of p_q's neighbors + * \param k_indices the resultant indices of the neighboring points + * \param k_sqr_distances the resultant squared distances to the neighboring points + * \param max_nn if given, bounds the maximum returned neighbors to this value + * \return number of neighbors found in radius + */ + int + getSimilarExemplars (const PointT &p_q, double radius, std::vector &k_indices, + std::vector &k_sqr_distances, int max_nn = INT_MAX) + { + return (tree_->radiusSearch (p_q, radius, k_indices, k_sqr_distances, max_nn)); + } + + /** \brief Gets the smallest square distance to each class given a neighborhood. + * \param k_indices the resultant indices of the neighboring points + * \param k_sqr_distances the resultant squared distances to the neighboring points + * \return a square distance to each training class + */ + boost::shared_ptr > + getSmallestSquaredDistances (std::vector &k_indices, std::vector &k_sqr_distances) + { + // Reserve space for distances + boost::shared_ptr > sqr_distances (new std::vector (classes_.size (), FLT_MAX)); + + // Select square distance to each class + for (std::vector::const_iterator i = k_indices.begin (); i != k_indices.end (); ++i) + if ((*sqr_distances)[labels_idx_[*i]] > k_sqr_distances[i - k_indices.begin ()]) + (*sqr_distances)[labels_idx_[*i]] = k_sqr_distances[i - k_indices.begin ()]; + return (sqr_distances); + } + + /** \brief Computes a score that is inversely proportional to the distance to each class given a neighborhood. + * \note Scores will sum up to one. + * \param k_indices the resultant indices of the neighboring points + * \param k_sqr_distances the resultant squared distances to the neighboring points + * \return pair of label and score for each training class from the neighborhood + */ + ResultPtr + getLinearBestScores (std::vector &k_indices, std::vector &k_sqr_distances) + { + // Get smallest squared distances and transform them to a score for each class + boost::shared_ptr > sqr_distances = getSmallestSquaredDistances (k_indices, k_sqr_distances); + + // Transform distances to scores + double sum_dist = 0; + boost::shared_ptr, std::vector > > result (new std::pair, std::vector > ()); + result->first.reserve (classes_.size ()); + result->second.reserve (classes_.size ()); + for (std::vector::const_iterator it = sqr_distances->begin (); it != sqr_distances->end (); ++it) + if (*it != FLT_MAX) + { + result->first.push_back (classes_[it - sqr_distances->begin ()]); + result->second.push_back (sqrt (*it)); + sum_dist += result->second.back (); + } + for (std::vector::iterator it = result->second.begin (); it != result->second.end (); ++it) + *it = 1 - *it/sum_dist; + + // Return label/score list pair + return (result); + } + + /** \brief Computes a score exponentially decreasing with the distance for each class given a neighborhood. + * \param[in] gaussian_param influences the width of the Gaussian: score = exp(-distance/gaussioan_param) + * \param[out] k_indices the resultant indices of the neighboring points + * \param[out] k_sqr_distances the resultant squared distances to the neighboring points + * \return pair of label and score for each training class from the neighborhood + */ + ResultPtr + getGaussianBestScores (float gaussian_param, std::vector &k_indices, std::vector &k_sqr_distances) + { + // Get smallest squared distances and transform them to a score for each class + boost::shared_ptr > sqr_distances = getSmallestSquaredDistances (k_indices, k_sqr_distances); + + // Transform distances to scores + boost::shared_ptr, std::vector > > result (new std::pair, std::vector > ()); + result->first.reserve (classes_.size ()); + result->second.reserve (classes_.size ()); + for (std::vector::const_iterator it = sqr_distances->begin (); it != sqr_distances->end (); ++it) + if (*it != FLT_MAX) + { + result->first.push_back (classes_[it - sqr_distances->begin ()]); + // TODO leave it squared, and relate param to sigma... + result->second.push_back (expf (-sqrtf (*it) / gaussian_param)); + } + + // Return label/score list pair + return (result); + } + }; +} + +#endif /* NNCLASSIFICATION_H_ */ diff --git a/apps/include/pcl/apps/openni_passthrough.h b/apps/include/pcl/apps/openni_passthrough.h new file mode 100644 index 00000000..6547c466 --- /dev/null +++ b/apps/include/pcl/apps/openni_passthrough.h @@ -0,0 +1,130 @@ +/* + * Software License Agreement (BSD License) + * + * Point Cloud Library (PCL) - www.pointclouds.org + * Copyright (c) 2009-2011, Willow Garage, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef PCL_APPS_OPENNI_PASSTHROUGH_3D_ +#define PCL_APPS_OPENNI_PASSTHROUGH_3D_ + +#ifdef __GNUC__ +#pragma GCC system_header +#endif + +#include +// QT4 +#include +#include +#include +// Boost +#include +// PCL +#include +#include +#include +#include +#include +#include + +// Useful macros +#define FPS_CALC(_WHAT_) \ +do \ +{ \ + static unsigned count = 0;\ + static double last = pcl::getTime ();\ + double now = pcl::getTime (); \ + ++count; \ + if (now - last >= 1.0) \ + { \ + std::cout << "Average framerate("<< _WHAT_ << "): " << double(count)/double(now - last) << " Hz" << std::endl; \ + count = 0; \ + last = now; \ + } \ +}while(false) + +namespace Ui +{ + class MainWindow; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +class OpenNIPassthrough : public QMainWindow +{ + Q_OBJECT + public: + typedef pcl::PointCloud Cloud; + typedef Cloud::Ptr CloudPtr; + typedef Cloud::ConstPtr CloudConstPtr; + + OpenNIPassthrough (pcl::OpenNIGrabber& grabber); + + ~OpenNIPassthrough () + { + if (grabber_.isRunning ()) + grabber_.stop (); + } + + void + cloud_cb (const CloudConstPtr& cloud); + + protected: + boost::shared_ptr vis_; + pcl::OpenNIGrabber& grabber_; + std::string device_id_; + CloudPtr cloud_pass_; + pcl::PassThrough pass_; + + private: + QMutex mtx_; + Ui::MainWindow *ui_; + QTimer *vis_timer_; + + public slots: + void + adjustPassThroughValues (int new_value) + { + pass_.setFilterLimits (0, new_value / 10.0f); + PCL_INFO ("Changed passthrough maximum value to: %f\n", float (new_value) / 10.0f); + } + + private slots: + void + timeoutSlot (); + + signals: + void + valueChanged (int new_value); +}; + +#endif // PCL_APPS_OPENNI_PASSTHROUGH_3D_ diff --git a/apps/include/pcl/apps/organized_segmentation_demo.h b/apps/include/pcl/apps/organized_segmentation_demo.h new file mode 100644 index 00000000..5163d04f --- /dev/null +++ b/apps/include/pcl/apps/organized_segmentation_demo.h @@ -0,0 +1,149 @@ +#include +// QT4 +#include +#include +#include +// Boost +#include +// PCL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef pcl::PointXYZRGBA PointT; + +// Useful macros +#define FPS_CALC(_WHAT_) \ +do \ +{ \ + static unsigned count = 0;\ + static double last = pcl::getTime ();\ + double now = pcl::getTime (); \ + ++count; \ + if (now - last >= 1.0) \ + { \ + std::cout << "Average framerate("<< _WHAT_ << "): " << double(count)/double(now - last) << " Hz" << std::endl; \ + count = 0; \ + last = now; \ + } \ +}while(false) + +namespace Ui +{ + class MainWindow; +} + +class OrganizedSegmentationDemo : public QMainWindow +{ + Q_OBJECT + public: + typedef pcl::PointCloud Cloud; + typedef Cloud::Ptr CloudPtr; + typedef Cloud::ConstPtr CloudConstPtr; + + + OrganizedSegmentationDemo(pcl::Grabber& grabber); + + ~OrganizedSegmentationDemo () + { + if(grabber_.isRunning()) + grabber_.stop(); + } + + void cloud_cb (const CloudConstPtr& cloud); + + protected: + boost::shared_ptr vis_; + pcl::Grabber& grabber_; + + QMutex mtx_; + QMutex vis_mtx_; + Ui::MainWindow *ui_; + QTimer *vis_timer_; + pcl::PointCloud prev_cloud_; + pcl::PointCloud prev_normals_; + std::vector, Eigen::aligned_allocator > > prev_regions_; + float* prev_distance_map_; + + pcl::PointCloud::CloudVectorType prev_clusters_; + + pcl::IntegralImageNormalEstimation ne; + pcl::OrganizedMultiPlaneSegmentation mps; + + bool capture_; + bool data_modified_; + size_t previous_data_size_; + size_t previous_clusters_size_; + + bool display_normals_; + bool display_curvature_; + bool display_distance_map_; + + bool use_planar_refinement_; + bool use_clustering_; + + pcl::PlaneCoefficientComparator::Ptr plane_comparator_; + pcl::EuclideanPlaneCoefficientComparator::Ptr euclidean_comparator_; + pcl::RGBPlaneCoefficientComparator::Ptr rgb_comparator_; + pcl::RGBPlaneCoefficientComparator rgb_comp_; + pcl::EdgeAwarePlaneComparator::Ptr edge_aware_comparator_; + pcl::EuclideanClusterComparator::Ptr euclidean_cluster_comparator_; + + public slots: + void toggleCapturePressed() + { + capture_ = !capture_; + } + + void usePlaneComparatorPressed (); + void useEuclideanComparatorPressed (); + void useRGBComparatorPressed (); + void useEdgeAwareComparatorPressed (); + + void displayCurvaturePressed (); + void displayDistanceMapPressed (); + void displayNormalsPressed (); + + void disableRefinementPressed () + { + use_planar_refinement_ = false; + } + + void usePlanarRefinementPressed () + { + use_planar_refinement_ = true; + } + + void disableClusteringPressed () + { + use_clustering_ = false; + } + + void useEuclideanClusteringPressed () + { + use_clustering_ = true; + } + + + private slots: + void + timeoutSlot(); + + +}; diff --git a/apps/include/pcl/apps/render_views_tesselated_sphere.h b/apps/include/pcl/apps/render_views_tesselated_sphere.h new file mode 100644 index 00000000..6c0a51a1 --- /dev/null +++ b/apps/include/pcl/apps/render_views_tesselated_sphere.h @@ -0,0 +1,151 @@ +/* + * render_views_tesselated_sphere.h + * + * Created on: Dec 23, 2011 + * Author: aitor + */ + +#ifndef RENDER_VIEWS_TESSELATED_SPHERE_H_ +#define RENDER_VIEWS_TESSELATED_SPHERE_H_ + +#include +#include +#include + +namespace pcl +{ + namespace apps + { + /** \brief @b Class to render synthetic views of a 3D mesh using a tesselated sphere + * NOTE: This class should replace renderViewTesselatedSphere from pcl::visualization. + * Some extensions are planned in the near future to this class like removal of duplicated views for + * symmetrical objects, generation of RGB synthetic clouds when RGB available on mesh, etc. + * \author Aitor Aldoma + * \ingroup apps + */ + class PCL_EXPORTS RenderViewsTesselatedSphere + { + private: + std::vector > poses_; + std::vector::Ptr> generated_views_; + std::vector entropies_; + int resolution_; + int tesselation_level_; + bool use_vertices_; + float view_angle_; + float radius_sphere_; + bool compute_entropy_; + vtkSmartPointer polydata_; + + public: + RenderViewsTesselatedSphere () + { + resolution_ = 150; + tesselation_level_ = 1; + use_vertices_ = false; + view_angle_ = 57; + radius_sphere_ = 1.f; + compute_entropy_ = false; + } + + /* \brief Sets the size of the render window + * \param res resolution size + */ + void + setResolution (int res) + { + resolution_ = res; + } + + /* \brief Wether to use the vertices or triangle centers of the tesselated sphere + * \param use true indicates to use vertices, false triangle centers + */ + + void + setUseVertices (bool use) + { + use_vertices_ = use; + } + + /* \brief Radius of the sphere where the virtual camera will be placed + * \param use true indicates to use vertices, false triangle centers + */ + void + setRadiusSphere (float radius) + { + radius_sphere_ = radius; + } + + /* \brief Wether to compute the entropies (level of occlusions for each view) + * \param compute true to compute entropies, false otherwise + */ + void + setComputeEntropies (bool compute) + { + compute_entropy_ = compute; + } + + /* \brief How many times the icosahedron should be tesselated. Results in more or less camera positions and generated views. + * \param level amount of tesselation + */ + void + setTesselationLevel (int level) + { + tesselation_level_ = level; + } + + /* \brief Sets the view angle of the virtual camera + * \param angle view angle in degrees + */ + void + setViewAngle (float angle) + { + view_angle_ = angle; + } + + /* \brief adds the mesh to be used as a vtkPolyData + * \param polydata vtkPolyData object + */ + void + addModelFromPolyData (vtkSmartPointer polydata) + { + polydata_ = polydata; + } + + /* \brief performs the rendering and stores the generated information + */ + void + generateViews (); + + /* \brief Get the generated poses for the generated views + * \param poses 4x4 matrices representing the pose of the cloud relative to the model coordinate system + */ + void + getPoses (std::vector > & poses) + { + poses = poses_; + } + + /* \brief Get the generated views + * \param views generated pointclouds in camera coordinates + */ + void + getViews (std::vector::Ptr> & views) + { + views = generated_views_; + } + + /* \brief Get the entropies (level of occlusions) for the views + * \param entropies level of occlusions + */ + void + getEntropies (std::vector & entropies) + { + entropies = entropies_; + } + }; + + } +} + +#endif /* RENDER_VIEWS_TESSELATED_SPHERE_H_ */ diff --git a/apps/include/pcl/apps/timer.h b/apps/include/pcl/apps/timer.h new file mode 100644 index 00000000..00f6bf15 --- /dev/null +++ b/apps/include/pcl/apps/timer.h @@ -0,0 +1,68 @@ +/* + * Software License Agreement (BSD License) + * + * Point Cloud Library (PCL) - www.pointclouds.org + * Copyright (c) 2012, Open Perception, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $Id: openni_viewer.cpp 5059 2012-03-14 02:12:17Z gedikli $ + * + */ + +#ifndef PCL_APPS_TIMER_H_ +#define PCL_APPS_TIMER_H_ + +#define MEASURE_FUNCTION_TIME +#include //fps calculations + +#if SHOW_FPS +#define FPS_CALC(_WHAT_) \ +do \ +{ \ + static unsigned count = 0;\ + static double last = pcl::getTime ();\ + double now = pcl::getTime (); \ + ++count; \ + if (now - last >= 1.0) \ + { \ + std::cout << "Average framerate("<< _WHAT_ << "): " << double(count)/double(now - last) << " Hz" << std::endl; \ + count = 0; \ + last = now; \ + } \ +}while(false) +#else +#define FPS_CALC(_WHAT_) \ +do \ +{ \ +}while(false) +#endif + +#endif // PCL_APPS_TIMER_H_ diff --git a/apps/include/pcl/apps/vfh_nn_classifier.h b/apps/include/pcl/apps/vfh_nn_classifier.h new file mode 100644 index 00000000..dcecba22 --- /dev/null +++ b/apps/include/pcl/apps/vfh_nn_classifier.h @@ -0,0 +1,269 @@ +/* + * Software License Agreement (BSD License) + * + * Copyright (c) 2010, Willow Garage, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $Id: vfh_nn_classifier.h 6218 2012-07-06 21:46:51Z aichim $ + * + */ + +#ifndef VFHCLASSIFICATION_H_ +#define VFHCLASSIFICATION_H_ + +#include +#include +#include +#include +#include +#include +#include + +namespace pcl +{ + /** \brief Helper function to extract the VFH feature describing the given point cloud. + * \param points point cloud for feature extraction + * \param radius search radius for normal estimation + * \return point cloud containing the extracted feature + */ + template pcl::PointCloud::Ptr + computeVFH (typename PointCloud::ConstPtr cloud, double radius) + { + using namespace pcl; + + // Create an empty kdtree representation, and pass it to the objects. + // Its content will be filled inside the object, based on the given input dataset (as no other search surface is given). + typename pcl::search::KdTree::Ptr tree (new pcl::search::KdTree ()); + + // Create the normal estimation class, and pass the input dataset to it + NormalEstimation ne; + ne.setInputCloud (cloud); + ne.setSearchMethod (tree); + + // Use all neighbors in a sphere of given radius to compute the normals + PointCloud::Ptr normals (new PointCloud ()); + ne.setRadiusSearch (radius); + ne.compute (*normals); + + // Create the VFH estimation class, and pass the input dataset+normals to it + VFHEstimation vfh; + vfh.setInputCloud (cloud); + vfh.setInputNormals (normals); + vfh.setSearchMethod (tree); + + // Output datasets + PointCloud::Ptr vfhs (new PointCloud); + + // Compute the features and return + vfh.compute (*vfhs); + return vfhs; + } + + /** + * \brief Utility class for nearest neighbor search based classification of VFH features. + * \author Zoltan Csaba Marton + */ + class VFHClassifierNN + { + public: + + typedef pcl::PointCloud FeatureCloud; + typedef pcl::PointCloud::Ptr FeatureCloudPtr; + typedef pcl::PointCloud::ConstPtr FeatureCloudConstPtr; + typedef NNClassification::Result Result; + typedef NNClassification::ResultPtr ResultPtr; + + private: + + /** \brief Point cloud containing the training VFH features */ + FeatureCloudPtr training_features_; + /** \brief Class label for each training example */ + std::vector labels_; + /** \brief Nearest neighbor classifier instantiated for VFH features */ + NNClassification classifier_; + + public: + + VFHClassifierNN () : training_features_ (), labels_ (), classifier_ () + { + reset (); + } + + void reset () + { + training_features_.reset (new FeatureCloud); + labels_.clear (); + classifier_ = NNClassification (); + } + + /** \brief Set up the classifier with the current training features and labels */ + void finalizeTraining () + { + finalizeTree (); + finalizeLabels (); + } + + /** \brief Set up the classifier with the current training features */ + void finalizeTree () + { + classifier_.setTrainingFeatures(training_features_); + } + + /** \brief Set up the classifier with the current training example labels */ + void finalizeLabels () + { + classifier_.setTrainingLabels(labels_); + } + + /** \brief Save the list of training examples and corresponding labels. + * \param file_name file name for writing the training features + * \param labels_file_name file name for writing the class label for each training example + * \return true on success, false on failure (write error or number of entries don't match) + */ + bool saveTrainingFeatures(std::string file_name, std::string labels_file_name) + { + if (labels_.size () == training_features_->points.size ()) + { + if (pcl::io::savePCDFile (file_name.c_str (), *training_features_) != 0) + return false; + std::ofstream f (labels_file_name.c_str ()); + BOOST_FOREACH (std::string s, labels_) + f << s << "\n"; + return true; + } + return false; + } + + /** \brief Fill the list of training examples and corresponding labels. + * \note this function has a cumulative effect. + * \param training_features the training features + * \param labels the class label for each training example + * \return true on success, false on failure (number of entries don't match) + */ + bool addTrainingFeatures (const FeatureCloudPtr training_features, const std::vector &labels) + { + if (labels.size () == training_features->points.size ()) + { + labels_.insert (labels_.end (), labels.begin (), labels.end ()); + training_features_->points.insert (training_features_->points.end (), training_features->points.begin (), training_features->points.end ()); + training_features_->header = training_features->header; + training_features_->height = 1; + training_features_->width = static_cast (training_features_->points.size ()); + training_features_->is_dense &= training_features->is_dense; + training_features_->sensor_origin_ = training_features->sensor_origin_; + training_features_->sensor_orientation_ = training_features->sensor_orientation_; + return true; + } + return false; + } + + /** \brief Fill the list of training examples and corresponding labels. + * \note this function has a cumulative effect. + * \param file_name PCD file containing the training features + * \param labels_file_name the class label for each training example + * \return true on success, false on failure (read error or number of entries don't match) + */ + bool loadTrainingFeatures(std::string file_name, std::string labels_file_name) + { + FeatureCloudPtr cloud (new FeatureCloud); + if (pcl::io::loadPCDFile (file_name.c_str (), *cloud) != 0) + return false; + std::vector labels; + std::ifstream f (labels_file_name.c_str ()); + std::string label; + while (getline (f, label)) + if (label.size () > 0) + labels.push_back(label); + return addTrainingFeatures (cloud, labels); + } + + /** \brief Add the feature extracted from the cloud at the specified + * location as a training example with the given labels. + * \note this function has a cumulative effect. + * \param file_name PCD file containing the training data + * \param label the class label for the training example + * \return true on success, false on failure (read error or number of entries don't match) + */ + bool loadTrainingData (std::string file_name, std::string label) + { + sensor_msgs::PointCloud2 cloud_blob; + if (pcl::io::loadPCDFile (file_name.c_str (), cloud_blob) != 0) + return false; + return addTrainingData (cloud_blob, label); + } + + /** \brief Add the feature extracted from the cloud as a training example with the given labels. + * \note this function has a cumulative effect. + * \param training_data point cloud for training feature extraction + * \param label the class label for the training example + * \return true on success, false on failure (read error or number of entries don't match) + */ + bool addTrainingData (const sensor_msgs::PointCloud2 &training_data, std::string &label) + { + // Create label list containing the single label + std::vector labels; + labels.push_back (label); + + // Compute the feature from the cloud and add it as a training example + FeatureCloudPtr vfhs = computeFeature (training_data); + return addTrainingFeatures(vfhs, labels); + } + + /** \brief Utility function for the default classification process. + * \param testing_data the point clouds to be classified + * \param radius the maximum search radius in feature space -- 300 by default + * \param minimum_score the score to be given to matches at maximum distance (>0) -- 0.002 by default + * \return pair of label and score for each relevant training class + */ + ResultPtr classify (const sensor_msgs::PointCloud2 &testing_data, double radius = 300, double min_score = 0.002) + { + // compute the VFH feature for this point cloud + FeatureCloudPtr vfhs = computeFeature (testing_data); + // compute gaussian parameter producing the desired minimum score (around 50 for the default values) + float gaussian_param = - static_cast (radius / log (min_score)); + // TODO accept result to be filled in by reference + return classifier_.classify(vfhs->points.at (0), radius, gaussian_param); + } + + /** \brief Extract the VFH feature describing the given point cloud. + * \param points point cloud for feature extraction + * \param radius search radius for normal estimation -- 0.03 m by default + * \return point cloud containing the extracted feature + */ + FeatureCloudPtr computeFeature (const sensor_msgs::PointCloud2 &points, double radius = 0.03) + { + pcl::PointCloud::Ptr cloud (new pcl::PointCloud ()); + pcl::fromROSMsg (points, *cloud); + return pcl::computeVFH (cloud, radius); + } + }; +} + +#endif /* VFHCLASSIFICATION_H_ */ diff --git a/apps/src/convolve.cpp b/apps/src/convolve.cpp new file mode 100644 index 00000000..90b0047e --- /dev/null +++ b/apps/src/convolve.cpp @@ -0,0 +1,209 @@ +/* + * Software License Agreement (BSD License) + * + * Point Cloud Library (PCL) - www.pointclouds.org + * Copyright (c) 2012, Willow Garage, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $Id: convolve.cpp 5358 2012-03-28 00:16:25Z nizar $ + */ + +#include +#include +#include +#include +#include +#include + +void +usage (char ** argv) +{ + pcl::console::print_info ("usage: %s <-r|-c|-s> [-p ] [-t ] [-d ]\n\n", argv[0]); + pcl::console::print_info ("Where options are:\n"); + pcl::console::print_info ("\t\t\t-r convolve rows\n"); + pcl::console::print_info ("\t\t\t-c convolve columns\n"); + pcl::console::print_info ("\t\t\t-s convolve separate\n"); + pcl::console::print_info ("\t\t\t-p borders policy\n"); + pcl::console::print_info ("\t\t\t\t Z zero padding, default\n"); + pcl::console::print_info ("\t\t\t\t D duplicate borders\n"); + pcl::console::print_info ("\t\t\t\t M mirror borders\n"); + pcl::console::print_info ("\t\t\t-t optional, number of threads, default 1\n"); + pcl::console::print_info ("\t\t\t-d optional, distance threshold, default 0.001\n"); +} + +int +main (int argc, char ** argv) +{ + int viewport_source, viewport_convolved = 0; + int direction = -1; + int nb_threads = 0; + char border_policy = 'Z'; + double threshold = 0.001; + pcl::filters::Convolution convolution; + Eigen::ArrayXf gaussian_kernel(5); + gaussian_kernel << 1.f/16, 1.f/4, 3.f/8, 1.f/4, 1.f/16; + pcl::console::print_info ("convolution kernel:"); + for (int i = 0; i < gaussian_kernel.size (); ++i) + pcl::console::print_info (" %f", gaussian_kernel[i]); + pcl::console::print_info ("\n"); + + if (argc < 3) + { + usage (argv); + return 1; + } + + // check if user is requesting help + std::string arg (argv[1]); + + if (arg == "--help" || arg == "-h") + { + usage (argv); + return 1; + } + + // user don't need help find convolving direction + // convolve row + if (pcl::console::find_switch (argc, argv, "-r")) + direction = 0; + else + { + // convolve column + if (pcl::console::find_switch (argc, argv, "-c")) + direction = 1; + else + // convolve both + if (pcl::console::find_switch (argc, argv, "-s")) + direction = 2; + else + { + // wrong direction given print usage + usage (argv); + return 1; + } + } + + // number of threads if any + if (pcl::console::parse_argument (argc, argv, "-t", nb_threads) != -1 ) + { + if (nb_threads <= 0) + nb_threads = 1; + } + convolution.setNumberOfThreads (nb_threads); + + // borders policy if any + if (pcl::console::parse_argument (argc, argv, "-p", border_policy) != -1 ) + { + switch (border_policy) + { + case 'Z' : convolution.setBordersPolicy (pcl::filters::Convolution::BORDERS_POLICY_IGNORE); + break; + case 'M' : convolution.setBordersPolicy (pcl::filters::Convolution::BORDERS_POLICY_MIRROR); + break; + case 'D' : convolution.setBordersPolicy (pcl::filters::Convolution::BORDERS_POLICY_DUPLICATE); + break; + default : + { + usage (argv); + return (1); + } + } + } + else + convolution.setBordersPolicy (pcl::filters::Convolution::BORDERS_POLICY_IGNORE); + + // distance threshold if any + if (pcl::console::parse_argument (argc, argv, "-d", threshold) == -1 ) + { + threshold = 0.01; + } + convolution.setDistanceThreshold (static_cast (threshold)); + + // all set + // we have file name and convolving direction + pcl::PointCloud::Ptr cloud (new pcl::PointCloud ()); + if (pcl::io::loadPCDFile (argv[1], *cloud) == -1) + { + pcl::console::print_error ("Couldn't read file %s \n", argv[1]); + return (-1); + } + cloud->is_dense = false; + convolution.setInputCloud (cloud); + convolution.setKernel (gaussian_kernel); + pcl::PointCloud::Ptr convolved (new pcl::PointCloud ()); + double t0; + pcl::console::print_info ("convolving %s along \n", argv[1]); + std::ostringstream convolved_label; + convolved_label << "convolved along "; + switch (direction) + { + case 0: + { + convolved_label << "rows... "; + t0 = pcl::getTime (); + convolution.convolveRows (*convolved); + break; + } + case 1: + { + convolved_label << "columns... "; + t0 = pcl::getTime (); + convolution.convolveCols (*convolved); + break; + } + case 2: + { + convolved_label << "rows and columns... "; + t0 = pcl::getTime (); + convolution.convolve (*convolved); + break; + } + } + convolved_label << pcl::getTime () - t0 << "s"; + // Display + boost::shared_ptr viewer (new pcl::visualization::PCLVisualizer ("Convolution")); + // viewport stuff + viewer->createViewPort (0, 0, 0.5, 1, viewport_source); + viewer->createViewPort (0.5, 0, 1, 1, viewport_convolved); + viewer->setBackgroundColor (0, 0, 0); + + // Source + pcl::visualization::PointCloudColorHandlerRGBField color_handler_source (cloud); + viewer->addPointCloud (cloud, color_handler_source, "source", viewport_source); + viewer->addText ("source", 10, 10, "source_label", viewport_source); + + // Convolved + pcl::visualization::PointCloudColorHandlerRGBField color_handler_convolved (convolved); + viewer->addPointCloud (convolved, color_handler_convolved, "convolved", viewport_convolved); + viewer->addText (convolved_label.str (), 10, 10, "convolved_label", viewport_convolved); + viewer->spin (); + pcl::PCDWriter writer; + writer.write ("convolved.pcd", *convolved, false); +} diff --git a/apps/src/dominant_plane_segmentation.cpp b/apps/src/dominant_plane_segmentation.cpp new file mode 100644 index 00000000..2caf4a26 --- /dev/null +++ b/apps/src/dominant_plane_segmentation.cpp @@ -0,0 +1,45 @@ +/* + * Software License Agreement (BSD License) + * + * Copyright (c) 2010, Willow Garage, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +#include + +#include +#include +#include +#include + +// Instantiations of specific point types +PCL_INSTANTIATE(DominantPlaneSegmentation, PCL_XYZ_POINT_TYPES) diff --git a/apps/src/feature_matching.cpp b/apps/src/feature_matching.cpp new file mode 100644 index 00000000..567ceb59 --- /dev/null +++ b/apps/src/feature_matching.cpp @@ -0,0 +1,658 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +template +class ICCVTutorial +{ + public: + ICCVTutorial (boost::shared_ptr > keypoint_detector, + typename pcl::Feature::Ptr feature_extractor, + boost::shared_ptr > surface_reconstructor, + typename pcl::PointCloud::ConstPtr source, + typename pcl::PointCloud::ConstPtr target); + + /** + * @brief starts the event loop for the visualizer + */ + void run (); + protected: + /** + * @brief remove plane and select largest cluster as input object + * @param input the input point cloud + * @param segmented the resulting segmented point cloud containing only points of the largest cluster + */ + void segmentation (typename pcl::PointCloud::ConstPtr input, typename pcl::PointCloud::Ptr segmented) const; + + /** + * @brief Detects key points in the input point cloud + * @param input the input point cloud + * @param keypoints the resulting key points. Note that they are not necessarily a subset of the input cloud + */ + void detectKeypoints (typename pcl::PointCloud::ConstPtr input, pcl::PointCloud::Ptr keypoints) const; + + /** + * @brief extract descriptors for given key points + * @param input point cloud to be used for descriptor extraction + * @param keypoints locations where descriptors are to be extracted + * @param features resulting descriptors + */ + void extractDescriptors (typename pcl::PointCloud::ConstPtr input, typename pcl::PointCloud::Ptr keypoints, typename pcl::PointCloud::Ptr features); + + /** + * @brief find corresponding features based on some metric + * @param source source feature descriptors + * @param target target feature descriptors + * @param correspondences indices out of the target descriptors that correspond (nearest neighbor) to the source descriptors + */ + void findCorrespondences (typename pcl::PointCloud::Ptr source, typename pcl::PointCloud::Ptr target, std::vector& correspondences) const; + + /** + * @brief remove non-consistent correspondences + */ + void filterCorrespondences (); + + /** + * @brief calculate the initial rigid transformation from filtered corresponding keypoints + */ + void determineInitialTransformation (); + + /** + * @brief calculate the final rigid transformation using ICP over all points + */ + void determineFinalTransformation (); + + /** + * @brief reconstructs the surface from merged point clouds + */ + void reconstructSurface (); + + /** + * @brief callback to handle keyboard events + * @param event object containing information about the event. e.g. type (press, release) etc. + * @param cookie user defined data passed during registration of the callback + */ + void keyboard_callback (const pcl::visualization::KeyboardEvent& event, void* cookie); + + private: + pcl::visualization::PCLVisualizer visualizer_; + pcl::PointCloud::Ptr source_keypoints_; + pcl::PointCloud::Ptr target_keypoints_; + boost::shared_ptr > keypoint_detector_; + typename pcl::Feature::Ptr feature_extractor_; + boost::shared_ptr > surface_reconstructor_; + typename pcl::PointCloud::ConstPtr source_; + typename pcl::PointCloud::ConstPtr target_; + typename pcl::PointCloud::Ptr source_segmented_; + typename pcl::PointCloud::Ptr target_segmented_; + typename pcl::PointCloud::Ptr source_transformed_; + typename pcl::PointCloud::Ptr source_registered_; + typename pcl::PolygonMesh surface_; + typename pcl::PointCloud::Ptr source_features_; + typename pcl::PointCloud::Ptr target_features_; + std::vector source2target_; + std::vector target2source_; + pcl::CorrespondencesPtr correspondences_; + Eigen::Matrix4f initial_transformation_matrix_; + Eigen::Matrix4f transformation_matrix_; + bool show_source2target_; + bool show_target2source_; + bool show_correspondences; +}; + +template +ICCVTutorial::ICCVTutorial(boost::shared_ptr >keypoint_detector, + typename pcl::Feature::Ptr feature_extractor, + boost::shared_ptr > surface_reconstructor, + typename pcl::PointCloud::ConstPtr source, + typename pcl::PointCloud::ConstPtr target) +: source_keypoints_ (new pcl::PointCloud ()) +, target_keypoints_ (new pcl::PointCloud ()) +, keypoint_detector_ (keypoint_detector) +, feature_extractor_ (feature_extractor) +, surface_reconstructor_ (surface_reconstructor) +, source_ (source) +, target_ (target) +, source_segmented_ (new pcl::PointCloud) +, target_segmented_ (new pcl::PointCloud) +, source_transformed_ (new pcl::PointCloud) +, source_registered_ (new pcl::PointCloud) +, source_features_ (new pcl::PointCloud) +, target_features_ (new pcl::PointCloud) +, correspondences_ (new pcl::Correspondences) +, show_source2target_ (false) +, show_target2source_ (false) +, show_correspondences (false) +{ + visualizer_.registerKeyboardCallback(&ICCVTutorial::keyboard_callback, *this, 0); + + segmentation (source_, source_segmented_); + segmentation (target_, target_segmented_); + + detectKeypoints (source_segmented_, source_keypoints_); + detectKeypoints (target_segmented_, target_keypoints_); + + extractDescriptors (source_segmented_, source_keypoints_, source_features_); + extractDescriptors (target_segmented_, target_keypoints_, target_features_); + + findCorrespondences (source_features_, target_features_, source2target_); + findCorrespondences (target_features_, source_features_, target2source_); + + filterCorrespondences (); + + determineInitialTransformation (); + determineFinalTransformation (); + + reconstructSurface (); +} + +template +void ICCVTutorial::segmentation (typename pcl::PointCloud::ConstPtr source, typename pcl::PointCloud::Ptr segmented) const +{ + cout << "segmentation..." << std::flush; + // fit plane and keep points above that plane + pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); + pcl::PointIndices::Ptr inliers (new pcl::PointIndices); + // Create the segmentation object + pcl::SACSegmentation seg; + // Optional + seg.setOptimizeCoefficients (true); + // Mandatory + seg.setModelType (pcl::SACMODEL_PLANE); + seg.setMethodType (pcl::SAC_RANSAC); + seg.setDistanceThreshold (0.02); + + seg.setInputCloud (source); + seg.segment (*inliers, *coefficients); + + pcl::ExtractIndices extract; + extract.setInputCloud (source); + extract.setIndices (inliers); + extract.setNegative (true); + + extract.filter (*segmented); + std::vector indices; + pcl::removeNaNFromPointCloud(*segmented, *segmented, indices); + cout << "OK" << endl; + + cout << "clustering..." << std::flush; + // euclidean clustering + typename pcl::search::KdTree::Ptr tree (new pcl::search::KdTree); + tree->setInputCloud (segmented); + + std::vector cluster_indices; + pcl::EuclideanClusterExtraction clustering; + clustering.setClusterTolerance (0.02); // 2cm + clustering.setMinClusterSize (1000); + clustering.setMaxClusterSize (250000); + clustering.setSearchMethod (tree); + clustering.setInputCloud(segmented); + clustering.extract (cluster_indices); + + if (cluster_indices.size() > 0)//use largest cluster + { + cout << cluster_indices.size() << " clusters found"; + if (cluster_indices.size() > 1) + cout <<" Using largest one..."; + cout << endl; + typename pcl::IndicesPtr indices (new std::vector); + *indices = cluster_indices[0].indices; + extract.setInputCloud (segmented); + extract.setIndices (indices); + extract.setNegative (false); + + extract.filter (*segmented); + } +} + +template +void ICCVTutorial::detectKeypoints (typename pcl::PointCloud::ConstPtr input, pcl::PointCloud::Ptr keypoints) const +{ + cout << "keypoint detection..." << std::flush; + keypoint_detector_->setInputCloud(input); + keypoint_detector_->compute(*keypoints); + cout << "OK. keypoints found: " << keypoints->points.size() << endl; +} + +template +void ICCVTutorial::extractDescriptors (typename pcl::PointCloud::ConstPtr input, typename pcl::PointCloud::Ptr keypoints, typename pcl::PointCloud::Ptr features) +{ + typename pcl::PointCloud::Ptr kpts(new pcl::PointCloud); + kpts->points.resize(keypoints->points.size()); + + pcl::copyPointCloud(*keypoints, *kpts); + + typename pcl::FeatureFromNormals::Ptr feature_from_normals = boost::dynamic_pointer_cast > (feature_extractor_); + + feature_extractor_->setSearchSurface(input); + feature_extractor_->setInputCloud(kpts); + + if (feature_from_normals) + //if (boost::dynamic_pointer_cast > (feature_extractor_)) + { + cout << "normal estimation..." << std::flush; + typename pcl::PointCloud::Ptr normals (new pcl::PointCloud); + pcl::NormalEstimation normal_estimation; + normal_estimation.setSearchMethod (pcl::search::Search::Ptr (new pcl::search::KdTree)); + normal_estimation.setRadiusSearch (0.01); + normal_estimation.setInputCloud (input); + normal_estimation.compute (*normals); + feature_from_normals->setInputNormals(normals); + cout << "OK" << endl; + } + + cout << "descriptor extraction..." << std::flush; + feature_extractor_->compute (*features); + cout << "OK" << endl; +} + +template +void ICCVTutorial::findCorrespondences (typename pcl::PointCloud::Ptr source, typename pcl::PointCloud::Ptr target, std::vector& correspondences) const +{ + cout << "correspondence assignment..." << std::flush; + correspondences.resize (source->size()); + + // Use a KdTree to search for the nearest matches in feature space + pcl::KdTreeFLANN descriptor_kdtree; + descriptor_kdtree.setInputCloud (target); + + // Find the index of the best match for each keypoint, and store it in "correspondences_out" + const int k = 1; + std::vector k_indices (k); + std::vector k_squared_distances (k); + for (int i = 0; i < static_cast (source->size ()); ++i) + { + descriptor_kdtree.nearestKSearch (*source, i, k, k_indices, k_squared_distances); + correspondences[i] = k_indices[0]; + } + cout << "OK" << endl; +} + +template +void ICCVTutorial::filterCorrespondences () +{ + cout << "correspondence rejection..." << std::flush; + std::vector > correspondences; + for (unsigned cIdx = 0; cIdx < source2target_.size (); ++cIdx) + if (target2source_[source2target_[cIdx]] == static_cast (cIdx)) + correspondences.push_back(std::make_pair(cIdx, source2target_[cIdx])); + + correspondences_->resize (correspondences.size()); + for (unsigned cIdx = 0; cIdx < correspondences.size(); ++cIdx) + { + (*correspondences_)[cIdx].index_query = correspondences[cIdx].first; + (*correspondences_)[cIdx].index_match = correspondences[cIdx].second; + } + + pcl::registration::CorrespondenceRejectorSampleConsensus rejector; + rejector.setInputCloud(source_keypoints_); + rejector.setTargetCloud(target_keypoints_); + rejector.setInputCorrespondences(correspondences_); + rejector.getCorrespondences(*correspondences_); + cout << "OK" << endl; +} + +template +void ICCVTutorial::determineInitialTransformation () +{ + cout << "initial alignment..." << std::flush; + pcl::registration::TransformationEstimation::Ptr transformation_estimation (new pcl::registration::TransformationEstimationSVD); + + transformation_estimation->estimateRigidTransformation (*source_keypoints_, *target_keypoints_, *correspondences_, initial_transformation_matrix_); + + pcl::transformPointCloud(*source_segmented_, *source_transformed_, initial_transformation_matrix_); + cout << "OK" << endl; +} + +template +void ICCVTutorial::determineFinalTransformation () +{ + cout << "final registration..." << std::flush; + pcl::Registration::Ptr registration (new pcl::IterativeClosestPoint); + registration->setInputCloud(source_transformed_); + //registration->setInputCloud(source_segmented_); + registration->setInputTarget (target_segmented_); + registration->setMaxCorrespondenceDistance(0.05); + registration->setRANSACOutlierRejectionThreshold (0.05); + registration->setTransformationEpsilon (0.000001); + registration->setMaximumIterations (1000); + registration->align(*source_registered_); + transformation_matrix_ = registration->getFinalTransformation(); + cout << "OK" << endl; +} + +template +void ICCVTutorial::reconstructSurface () +{ + cout << "surface reconstruction..." << std::flush; + // merge the transformed and the target point cloud + pcl::PointCloud::Ptr merged (new pcl::PointCloud); + *merged = *source_registered_; + *merged += *target_segmented_; + + // apply grid filtering to reduce amount of points as well as to make them uniform distributed + pcl::VoxelGrid voxel_grid; + voxel_grid.setInputCloud(merged); + voxel_grid.setLeafSize (0.002f, 0.002f, 0.002f); + voxel_grid.setDownsampleAllData(true); + voxel_grid.filter(*merged); + + pcl::PointCloud::Ptr vertices (new pcl::PointCloud); + pcl::copyPointCloud(*merged, *vertices); + + pcl::NormalEstimation normal_estimation; + normal_estimation.setSearchMethod (pcl::search::Search::Ptr (new pcl::search::KdTree)); + normal_estimation.setRadiusSearch (0.01); + normal_estimation.setInputCloud (merged); + normal_estimation.compute (*vertices); + + pcl::search::KdTree::Ptr tree (new pcl::search::KdTree); + tree->setInputCloud (vertices); + + surface_reconstructor_->setSearchMethod(tree); + surface_reconstructor_->setInputCloud(vertices); + surface_reconstructor_->reconstruct(surface_); + cout << "OK" << endl; +} + +template +void ICCVTutorial::run() +{ + visualizer_.spin (); +} + +template +void ICCVTutorial::keyboard_callback (const pcl::visualization::KeyboardEvent& event, void*) +{ + if (event.keyUp()) + { + switch (event.getKeyCode()) + { + case '1': + if (!visualizer_.removePointCloud("source_points")) + { + visualizer_.addPointCloud(source_, "source_points"); + } + break; + + case '2': + if (!visualizer_.removePointCloud("target_points")) + { + visualizer_.addPointCloud(target_, "target_points"); + } + break; + + case '3': + if (!visualizer_.removePointCloud("source_segmented")) + { + visualizer_.addPointCloud(source_segmented_, "source_segmented"); + } + break; + + case '4': + if (!visualizer_.removePointCloud("target_segmented")) + { + visualizer_.addPointCloud(target_segmented_, "target_segmented"); + } + break; + + case '5': + if (!visualizer_.removePointCloud("source_keypoints")) + { + pcl::visualization::PointCloudColorHandlerCustom keypoint_color (source_keypoints_, 0, 0, 255); + //pcl::visualization::PointCloudColorHandlerGenericField keypoint_color (source_keypoints_, "intensity"); + visualizer_.addPointCloud(source_keypoints_, keypoint_color, "source_keypoints"); + } + break; + + case '6': + if (!visualizer_.removePointCloud("target_keypoints")) + { + //pcl::visualization::PointCloudColorHandlerGenericField keypoint_color (target_keypoints_, "intensity"); + pcl::visualization::PointCloudColorHandlerCustom keypoint_color (target_keypoints_, 255, 0, 0); + visualizer_.addPointCloud(target_keypoints_, keypoint_color, "target_keypoints"); + } + break; + + case '7': + if (!show_source2target_) + visualizer_.addCorrespondences(source_keypoints_, target_keypoints_, source2target_, "source2target"); + else + visualizer_.removeCorrespondences("source2target"); + + show_source2target_ = !show_source2target_; + break; + + case '8': + if (!show_target2source_) + visualizer_.addCorrespondences(target_keypoints_, source_keypoints_, target2source_, "target2source"); + else + visualizer_.removeCorrespondences("target2source"); + + show_target2source_ = !show_target2source_; + break; + + case '9': + if (!show_correspondences) + visualizer_.addCorrespondences(source_keypoints_, target_keypoints_, *correspondences_, "correspondences"); + else + visualizer_.removeCorrespondences("correspondences"); + show_correspondences = !show_correspondences; + break; + + case 'i': + case 'I': + if (!visualizer_.removePointCloud("transformed")) + visualizer_.addPointCloud(source_transformed_, "transformed"); + break; + + case 'r': + case 'R': + if (!visualizer_.removePointCloud("registered")) + visualizer_.addPointCloud(source_registered_, "registered"); + break; + + case 't': + case 'T': + visualizer_.addPolygonMesh(surface_, "surface"); + break; + } + } +} + +int +main (int argc, char ** argv) +{ + if (argc < 6) + { + pcl::console::print_info ("Syntax is: %s \n", argv[0]); + pcl::console::print_info ("available : 1 = Sift3D\n"); + pcl::console::print_info (" 2 = Harris3D\n"); + pcl::console::print_info (" 3 = Tomasi3D\n"); + pcl::console::print_info (" 4 = Noble3D\n"); + pcl::console::print_info (" 5 = Lowe3D\n"); + pcl::console::print_info (" 6 = Curvature3D\n\n"); + pcl::console::print_info ("available : 1 = FPFH\n"); + pcl::console::print_info (" 2 = SHOTRGB\n"); + pcl::console::print_info (" 3 = PFH\n"); + pcl::console::print_info (" 4 = PFHRGB\n\n"); + pcl::console::print_info ("available : 1 = Greedy Projection\n"); + pcl::console::print_info (" 2 = Marching Cubes\n"); + + return (1); + } + pcl::console::print_info ("== MENU ==\n"); + pcl::console::print_info ("1 - show/hide source point cloud\n"); + pcl::console::print_info ("2 - show/hide target point cloud\n"); + pcl::console::print_info ("3 - show/hide segmented source point cloud\n"); + pcl::console::print_info ("4 - show/hide segmented target point cloud\n"); + pcl::console::print_info ("5 - show/hide source key points\n"); + pcl::console::print_info ("6 - show/hide target key points\n"); + pcl::console::print_info ("7 - show/hide source2target correspondences\n"); + pcl::console::print_info ("8 - show/hide target2source correspondences\n"); + pcl::console::print_info ("9 - show/hide consistent correspondences\n"); + pcl::console::print_info ("i - show/hide initial alignment\n"); + pcl::console::print_info ("r - show/hide final registration\n"); + pcl::console::print_info ("t - show/hide triangulation (surface reconstruction)\n"); + pcl::console::print_info ("h - show visualizer options\n"); + pcl::console::print_info ("q - quit\n"); + + pcl::PointCloud::Ptr source (new pcl::PointCloud); + pcl::io::loadPCDFile (argv[1], *source); + + pcl::PointCloud::Ptr target (new pcl::PointCloud); + pcl::io::loadPCDFile (argv[2], *target); + + int keypoint_type = atoi (argv[3]); + int descriptor_type = atoi (argv[4]); + int surface_type = atoi (argv[5]); + + boost::shared_ptr > keypoint_detector; + + if (keypoint_type == 1) + { + pcl::SIFTKeypoint* sift3D = new pcl::SIFTKeypoint; + sift3D->setScales (0.01f, 3, 2); + sift3D->setMinimumContrast (0.0); + keypoint_detector.reset (sift3D); + } + else + { + pcl::HarrisKeypoint3D* harris3D = new pcl::HarrisKeypoint3D (pcl::HarrisKeypoint3D::HARRIS); + harris3D->setNonMaxSupression (true); + harris3D->setRadius (0.01f); + harris3D->setRadiusSearch (0.01f); + keypoint_detector.reset (harris3D); + switch (keypoint_type) + { + case 2: + harris3D->setMethod(pcl::HarrisKeypoint3D::HARRIS); + break; + + case 3: + harris3D->setMethod(pcl::HarrisKeypoint3D::TOMASI); + break; + + case 4: + harris3D->setMethod(pcl::HarrisKeypoint3D::NOBLE); + break; + + case 5: + harris3D->setMethod(pcl::HarrisKeypoint3D::LOWE); + break; + + case 6: + harris3D->setMethod(pcl::HarrisKeypoint3D::CURVATURE); + break; + default: + pcl::console::print_error("unknown key point detection method %d\n expecting values between 1 and 6", keypoint_type); + exit (1); + break; + } + + } + + boost::shared_ptr > surface_reconstruction; + + if (surface_type == 1) + { + pcl::GreedyProjectionTriangulation* gp3 = new pcl::GreedyProjectionTriangulation; + + // Set the maximum distance between connected points (maximum edge length) + gp3->setSearchRadius (0.025); + + // Set typical values for the parameters + gp3->setMu (2.5); + gp3->setMaximumNearestNeighbors (100); + gp3->setMaximumSurfaceAngle(M_PI/4); // 45 degrees + gp3->setMinimumAngle(M_PI/18); // 10 degrees + gp3->setMaximumAngle(2*M_PI/3); // 120 degrees + gp3->setNormalConsistency(false); + surface_reconstruction.reset(gp3); + } + else if (surface_type == 2) + { + pcl::MarchingCubes* mc = new pcl::MarchingCubesHoppe; + mc->setIsoLevel (0.001f); + mc->setGridResolution (50, 50, 50); + surface_reconstruction.reset(mc); + } + else + { + pcl::console::print_error("unknown surface reconstruction method %d\n expecting values between 1 and 2", surface_type); + exit (1); + } + + switch (descriptor_type) + { + case 1: + { + pcl::Feature::Ptr feature_extractor (new pcl::FPFHEstimationOMP); + feature_extractor->setSearchMethod (pcl::search::Search::Ptr (new pcl::search::KdTree)); + feature_extractor->setRadiusSearch (0.05); + ICCVTutorial tutorial (keypoint_detector, feature_extractor, surface_reconstruction, source, target); + tutorial.run (); + } + break; + + case 2: + { + pcl::SHOTEstimationOMP* shot = new pcl::SHOTEstimationOMP; + shot->setRadiusSearch (0.04); + pcl::Feature::Ptr feature_extractor (shot); + ICCVTutorial tutorial (keypoint_detector, feature_extractor, surface_reconstruction, source, target); + tutorial.run (); + } + break; + + case 3: + { + pcl::Feature::Ptr feature_extractor (new pcl::PFHEstimation); + feature_extractor->setKSearch(50); + ICCVTutorial tutorial (keypoint_detector, feature_extractor, surface_reconstruction, source, target); + tutorial.run (); + } + break; + + case 4: + { + pcl::Feature::Ptr feature_extractor (new pcl::PFHRGBEstimation); + feature_extractor->setKSearch(50); + ICCVTutorial tutorial (keypoint_detector, feature_extractor, surface_reconstruction, source, target); + tutorial.run (); + } + break; + + default: + pcl::console::print_error("unknown descriptor type %d\n expecting values between 1 and 4", descriptor_type); + exit (1); + break; + } + + return (0); +} diff --git a/apps/src/multiscale_feature_persistence_example.cpp b/apps/src/multiscale_feature_persistence_example.cpp new file mode 100644 index 00000000..8794c014 --- /dev/null +++ b/apps/src/multiscale_feature_persistence_example.cpp @@ -0,0 +1,131 @@ +/* + * Software License Agreement (BSD License) + * + * Point Cloud Library (PCL) - www.pointclouds.org + * Copyright (c) 2009-2012, Willow Garage, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +#include +#include +#include +#include +#include + +#include + +using namespace pcl; + +const Eigen::Vector4f subsampling_leaf_size (0.01f, 0.01f, 0.01f, 0.0f); +const float normal_estimation_search_radius = 0.05f; + + +void +subsampleAndCalculateNormals (PointCloud::Ptr &cloud, + PointCloud::Ptr &cloud_subsampled, + PointCloud::Ptr &cloud_subsampled_normals) +{ + cloud_subsampled = PointCloud::Ptr (new PointCloud ()); + VoxelGrid subsampling_filter; + subsampling_filter.setInputCloud (cloud); + subsampling_filter.setLeafSize (subsampling_leaf_size); + subsampling_filter.filter (*cloud_subsampled); + + cloud_subsampled_normals = PointCloud::Ptr (new PointCloud ()); + NormalEstimation normal_estimation_filter; + normal_estimation_filter.setInputCloud (cloud_subsampled); + pcl::search::KdTree::Ptr search_tree (new pcl::search::KdTree); + normal_estimation_filter.setSearchMethod (search_tree); + normal_estimation_filter.setRadiusSearch (normal_estimation_search_radius); + normal_estimation_filter.compute (*cloud_subsampled_normals); +} + + +int +main (int argc, char **argv) +{ + if (argc != 2) + { + PCL_ERROR ("Syntax: ./multiscale_feature_persistence_example [path_to_cloud.pcl]\n"); + return -1; + } + + PointCloud::Ptr cloud_scene (new PointCloud ()); + PCDReader reader; + reader.read (argv[1], *cloud_scene); + + PointCloud::Ptr cloud_subsampled; + PointCloud::Ptr cloud_subsampled_normals; + subsampleAndCalculateNormals (cloud_scene, cloud_subsampled, cloud_subsampled_normals); + + PCL_INFO ("STATS:\ninitial point cloud size: %u\nsubsampled point cloud size: %u\n", cloud_scene->points.size (), cloud_subsampled->points.size ()); + visualization::CloudViewer viewer ("Multiscale Feature Persistence Example Visualization"); + viewer.showCloud (cloud_scene, "scene"); + + + MultiscaleFeaturePersistence feature_persistence; + std::vector scale_values; + for (float x = 2.0f; x < 3.6f; x += 0.35f) + scale_values.push_back (x / 100.0f); + feature_persistence.setScalesVector (scale_values); + feature_persistence.setAlpha (1.3f); + FPFHEstimation::Ptr fpfh_estimation (new FPFHEstimation ()); + fpfh_estimation->setInputCloud (cloud_subsampled); + fpfh_estimation->setInputNormals (cloud_subsampled_normals); + pcl::search::KdTree::Ptr tree (new pcl::search::KdTree ()); + fpfh_estimation->setSearchMethod (tree); + feature_persistence.setFeatureEstimator (fpfh_estimation); + feature_persistence.setDistanceMetric (pcl::CS); + + PointCloud::Ptr output_features (new PointCloud ()); + boost::shared_ptr > output_indices (new std::vector ()); + feature_persistence.determinePersistentFeatures (*output_features, output_indices); + + PCL_INFO ("persistent features cloud size: %u\n", output_features->points.size ()); + + ExtractIndices extract_indices_filter; + extract_indices_filter.setInputCloud (cloud_subsampled); + extract_indices_filter.setIndices (output_indices); + PointCloud::Ptr persistent_features_locations (new PointCloud ()); + extract_indices_filter.filter (*persistent_features_locations); + + viewer.showCloud (persistent_features_locations, "persistent features"); + PCL_INFO ("Persistent features have been computed. Waiting for the user to quit the visualization window.\n"); + +// io::savePCDFileASCII ("persistent_features.pcd", *persistent_features_locations); +// PCL_INFO ("\nPersistent feature locations written to persistent_features.pcd\n"); + + while (!viewer.wasStopped (50)); + + return 0; +} diff --git a/apps/src/ni_linemod.cpp b/apps/src/ni_linemod.cpp new file mode 100644 index 00000000..8eac29ca --- /dev/null +++ b/apps/src/ni_linemod.cpp @@ -0,0 +1,574 @@ +/* + * Software License Agreement (BSD License) + * + * Point Cloud Library (PCL) - www.pointclouds.org + * Copyright (c) 2010-2012, Willow Garage, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $Id: openni_viewer.cpp 5059 2012-03-14 02:12:17Z gedikli $ + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace pcl; +using namespace std; + +typedef PointXYZRGBA PointT; + +#define SHOW_FPS 1 + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +class NILinemod +{ + public: + typedef PointCloud Cloud; + typedef Cloud::Ptr CloudPtr; + typedef Cloud::ConstPtr CloudConstPtr; + bool added; + + NILinemod (Grabber& grabber) + : cloud_viewer_ ("PointCloud") + , grabber_ (grabber) + , image_viewer_ ("Image") + , first_frame_ (true) + { + added = false; + + // Set the parameters for normal estimation + ne_.setNormalEstimationMethod (ne_.COVARIANCE_MATRIX); + ne_.setMaxDepthChangeFactor (0.02f); + ne_.setNormalSmoothingSize (20.0f); + + // Set the parameters for planar segmentation + plane_comparator_.reset (new EdgeAwarePlaneComparator); + plane_comparator_->setDistanceThreshold (0.01f, false); + mps_.setMinInliers (5000); + mps_.setAngularThreshold (pcl::deg2rad (3.0)); // 3 degrees + mps_.setDistanceThreshold (0.02); // 2 cm + mps_.setMaximumCurvature (0.001); // a small curvature + mps_.setProjectPoints (true); + mps_.setComparator (plane_comparator_); + } + + ///////////////////////////////////////////////////////////////////////// + void + cloud_callback (const CloudConstPtr& cloud) + { + FPS_CALC ("cloud callback"); + boost::mutex::scoped_lock lock (cloud_mutex_); + cloud_ = cloud; + search_.setInputCloud (cloud); + + // Subsequent frames are segmented by "tracking" the parameters of the previous frame + // We do this by using the estimated inliers from previous frames in the current frame, + // and refining the coefficients + + if (!first_frame_) + { + if (!plane_indices_ || plane_indices_->indices.empty () || !search_.getInputCloud ()) + { + PCL_ERROR ("Lost tracking. Select the object again to continue.\n"); + first_frame_ = true; + return; + } + SACSegmentation seg; + seg.setOptimizeCoefficients (true); + seg.setModelType (SACMODEL_PLANE); + seg.setMethodType (SAC_RANSAC); + seg.setMaxIterations (1000); + seg.setDistanceThreshold (0.01); + seg.setInputCloud (search_.getInputCloud ()); + seg.setIndices (plane_indices_); + ModelCoefficients coefficients; + PointIndices inliers; + seg.segment (inliers, coefficients); + + if (inliers.indices.empty ()) + { + PCL_ERROR ("No planar model found. Select the object again to continue.\n"); + first_frame_ = true; + return; + } + + // Visualize the object in 3D... + CloudPtr plane_inliers (new Cloud); + pcl::copyPointCloud (*search_.getInputCloud (), inliers.indices, *plane_inliers); + if (plane_inliers->points.empty ()) + { + PCL_ERROR ("No planar model found. Select the object again to continue.\n"); + first_frame_ = true; + return; + } + else + { + plane_.reset (new Cloud); + + // Compute the convex hull of the plane + ConvexHull chull; + chull.setDimension (2); + chull.setInputCloud (plane_inliers); + chull.reconstruct (*plane_); + } + } + } + + ///////////////////////////////////////////////////////////////////////// + CloudConstPtr + getLatestCloud () + { + // Lock while we swap our cloud and reset it. + boost::mutex::scoped_lock lock (cloud_mutex_); + CloudConstPtr temp_cloud; + temp_cloud.swap (cloud_); + return (temp_cloud); + } + + ///////////////////////////////////////////////////////////////////////// + void + keyboard_callback (const visualization::KeyboardEvent&, void*) + { + //if (event.getKeyCode()) + // cout << "the key \'" << event.getKeyCode() << "\' (" << event.getKeyCode() << ") was"; + //else + // cout << "the special key \'" << event.getKeySym() << "\' was"; + //if (event.keyDown()) + // cout << " pressed" << endl; + //else + // cout << " released" << endl; + } + + ///////////////////////////////////////////////////////////////////////// + void + mouse_callback (const visualization::MouseEvent& mouse_event, void*) + { + //if (mouse_event.getType() == visualization::MouseEvent::MouseButtonPress && mouse_event.getButton() == visualization::MouseEvent::LeftButton) + //{ + // cout << "left button pressed @ " << mouse_event.getX () << " , " << mouse_event.getY () << endl; + //} + } + + ///////////////////////////////////////////////////////////////////////// + /** \brief Given a plane, and the set of inlier indices representing it, + * segment out the object of intererest supported by it. + * + * \param[in] picked_idx the index of a point on the object + * \param[in] cloud the full point cloud dataset + * \param[in] plane_indices a set of indices representing the plane supporting the object of interest + * \param[in] plane_boundary_indices a set of indices representing the boundary of the plane + * \param[out] object the segmented resultant object + */ + void + segmentObject (int picked_idx, + const CloudConstPtr &cloud, + const PointIndices::Ptr &plane_indices, + const PointIndices::Ptr &plane_boundary_indices, + Cloud &object) + { + CloudPtr plane_hull (new Cloud); + + // Compute the convex hull of the plane + ConvexHull chull; + chull.setDimension (2); + chull.setInputCloud (cloud); + chull.setIndices (plane_boundary_indices); + chull.reconstruct (*plane_hull); + + // Remove the plane indices from the data + PointIndices::Ptr everything_but_the_plane (new PointIndices); + if (indices_fullset_.size () != cloud->points.size ()) + { + indices_fullset_.resize (cloud->points.size ()); + for (int p_it = 0; p_it < static_cast (indices_fullset_.size ()); ++p_it) + indices_fullset_[p_it] = p_it; + } + std::vector indices_subset = plane_indices->indices; + std::sort (indices_subset.begin (), indices_subset.end ()); + set_difference (indices_fullset_.begin (), indices_fullset_.end (), + indices_subset.begin (), indices_subset.end (), + inserter (everything_but_the_plane->indices, everything_but_the_plane->indices.begin ())); + + // Extract all clusters above the hull + PointIndices::Ptr points_above_plane (new PointIndices); + ExtractPolygonalPrismData exppd; + exppd.setInputCloud (cloud); + exppd.setInputPlanarHull (plane_hull); + exppd.setIndices (everything_but_the_plane); + exppd.setHeightLimits (0.0, 0.5); // up to half a meter + exppd.segment (*points_above_plane); + + // Use an organized clustering segmentation to extract the individual clusters + EuclideanClusterComparator::Ptr euclidean_cluster_comparator (new EuclideanClusterComparator); + euclidean_cluster_comparator->setInputCloud (cloud); + euclidean_cluster_comparator->setDistanceThreshold (0.03f, false); + // Set the entire scene to false, and the inliers of the objects located on top of the plane to true + Label l; l.label = 0; + PointCloud